前言
自定义日志驱动,将 error
等类型入库,配合后台管理定位问题.
log.php
`
return [
// 日志记录方式,内置 file socket 支持扩展
// 对应 LogFileWithDb 的命令空间
'type' => '\\app\\define\\log\\LogFileWithDb',
// 日志保存目录
'path' => '',
// 日志记录级别
'level' => [],
// 单文件日志写入
'single' => false,
// 独立日志级别
'apart_level' => [],
// 最大日志文件数量
'max_files' => 0,
// 是否关闭日志写入
'close' => false,
];
LogFileWithDb.php
`
namespace app\vdsns\log;
use think\App;
use think\Exception;
use think\log\driver\File;
/**自定义日志驱动
* Class VdLog Driver
* @author sjm
* @package app\vdsns\log
*/
class VdLogFileWithDb extends File
{
/**
* 对应的level
*/
const DE_EMERGENCY = 'emergency';
const DE_ALERT = 'alert';
const DE_CRITICAL = 'critical';
const DE_ERROR = 'error';
const DE_WARNING = 'warning';
const DE_NOTICE = 'notice';
const DE_INFO = 'info';
const DE_DEBUG = 'debug';
const DE_SQL = 'sql';
/**
* @var bool
*/
protected $save_db = true;
/**
* VdLog constructor.
* @param mixed ...$args
*/
public function __construct(App $app,$config = [])
{
parent::__construct($app,$config);
//cli模式日志不入库
if (PHP_SAPI == 'cli') {
$this->save_db = false;
}
}
/**
* @param array $log
* @param bool $append
* @return bool
*/
public function save(array $log = [], $append = false)
{
//TODO::自定义写入规则
//$this->intoSave($log);
return parent::save($log,$append);
}
/**
* @param array $message
* @param string $destination
* @param bool $apart
* @param bool $append
* @return bool
*/
public function write($message, $destination, $apart = false, $append = false)
{
$this->intoWrite($message, $destination, $apart, $append);
return parent::write($message, $destination, $apart, $append);
}
/**
* @param $log
*/
protected function intoSave($log)
{
$this->intoDB($log);
}
/**
* @param $message
* @param $destination
* @param bool $apart
* @param bool $append
*/
protected function intoWrite($message, $destination, $apart = false, $append = false)
{
$log = [
'message' => $message,
'destination' => $destination,
'apart' => $apart,
'append' => $append,
];
//TODO::自定义写入规则
if(isset($message['error'])) {
//只记录错误
$this->intoDB($log);
}
}
/**
* @param $log
*/
protected function intoDB($log)
{
if($this->save_db) {
$ruleLog = $this->dbLogRule($log);
if($ruleLog) {
try {
// 对应日志表的模型
Model::create($this->dbLogRule($log));
}catch (Exception $exception) {
}
}
}
}
/** 规则
* @param $log
* @return array
*/
protected function dbLogRule($log)
{
//TODO::定义模型规则
$data = [
'logs' => json_encode($log, true),
'create_time' => date('Y-m-d H:i:s'),
];
return $data;
}
}
提示
这里只实现了简单的规则,方便后台查找!还有很多地方可以优化!
`
`
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。