tp5实现日志记录
1.安装 psr/log
composer require psr/log

它的作用就是提供一套接口,实现正常的日志功能!
我们可以来细细的分析一下,LoggerInterface.php
<?php
namespace Psr\Log;
interface LoggerInterface
{
public function emergency($message, array $context = array());
public function alert($message, array $context = array());
public function critical($message, array $context = array());
public function error($message, array $context = array());
public function warning($message, array $context = array());
public function notice($message, array $context = array());
public function info($message, array $context = array());
public function debug($message, array $context = array());
public function log($level, $message, array $context = array());
}
这是一套日志正常的接口,有层级,有消息,有具体的内容。
LogLevel.php
<?php
namespace Psr\Log;
class LogLevel
{
const EMERGENCY = 'emergency';
const ALERT = 'alert';
const CRITICAL = 'critical';
const ERROR = 'error';
const WARNING = 'warning';
const NOTICE = 'notice';
const INFO = 'info';
const DEBUG = 'debug';
}
定义一些错误常量。
AbstractLogger.php实现接口
<?php
namespace Psr\Log;
abstract class AbstractLogger implements LoggerInterface
{
public function emergency($message, array $context = array())
{
$this->log(LogLevel::EMERGENCY, $message, $context);
}
public function alert($message, array $context = array())
{
$this->log(LogLevel::ALERT, $message, $context);
}
public function critical($message, array $context = array())
{
$this->log(LogLevel::CRITICAL, $message, $context);
}
public function error($message, array $context = array())
{
$this->log(LogLevel::ERROR, $message, $context);
}
public function warning($message, array $context = array())
{
$this->log(LogLevel::WARNING, $message, $context);
}
public function notice($message, array $context = array())
{
$this->log(LogLevel::NOTICE, $message, $context);
}
public function info($message, array $context = array())
{
$this->log(LogLevel::INFO, $message, $context);
}
public function debug($message, array $context = array())
{
$this->log(LogLevel::DEBUG, $message, $context);
}
}
Logger.php继承AbstractLogger.php
<?php
namespace Psr\Log;
use app\index\model\LogModel;
class Logger extends AbstractLogger
{
public function log($level, $message, array $context = array())
{
$logModel = new LogModel();
$logModel->add($level,$message,json_encode($context));
echo $logModel->id;
}
}
这里面的log方法是我自己写的!!!
我们需要把日志存储到数据库中!!!
这里我设计了一个log表,包含id、level、message、 context、ip、url、create_on等。
我创建了一个LogModel.php
<?php
namespace app\index\model;
use think\Model;
class LogModel extends Model
{
protected $pk = 'id';
protected $table = 'log';
public function add($level = "error",$message = "出错啦",$context = "") {
$this->data([
'level' => $level,
'message' => $message,
'context' => $context,
'ip' => getIp(),
'url' => getUrl(),
'create_on' => date('Y-m-d H:i:s',time())
]);
$this->save();
return $this->id;
}
}
一切都准备好了,可以在控制器中使用了!
<?php
namespace app\index\controller;
use think\Controller;
use Psr\Log\Logger;
class Index extends Controller
{
public function index()
{
$logger = new Logger();
$context = array();
$context['err'] = "缺少参数id";
$logger->info("有新消息");
}
public function _empty() {
return "empty";
}
}

小结:
composer很好很强大!
这里是接口Interface的典型案例,定义接口,定义抽象类,定义具体类。
有了命名空间,可以很好的引用不同文件夹下的库!
互相使用,能够防止高内聚!即便是耦合也相对比较独立!
有了这个日志小工具,平时接口的一些报错信息就能很好的捕捉了!
只要
然后
$logger = new Logger();
$logger->info("info信息");
使用非常方便!!!
附上获取ip、获取url的方法。
function getIp() {
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else
if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else
if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else
if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknown";
return ($ip);
}
function getUrl() {
return 'http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
}
本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/7850916.html,如需转载请自行联系原作者