日志写入数据库
Thinkphp5默认把日志信息保存在Runtime/log目录下,如果我们是多个Web服务器同时做负载均衡,那么就需要把日志集中保存到一台日志服务器中。Tp5作者已经考虑到了这点,我们只需要去写一个保存类,然后将tp5默认配置的File驱动修改为定义好的类,这样就可以更换tp5给我们默认提供的文件保存类。
先改一下配置文件 config.php 里的驱动类
'log' => [
// 日志记录方式,内置 file socket 支持扩展
// 'type' => 'File',
'type' => '\\log\\Mysql',
// 日志保存目录
'path' => LOG_PATH,
// 日志记录级别
'level' => [],
],
编写驱动类
db = Db::connect([
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'thinkphp5',
// 用户名
'username' => 'root',
// 密码
'password' => 'toor',
// 端口
'hostport' => '3306',
// 数据库编码默认采用utf8
'charset' => 'utf8',
]);
}
/**
* 日志写入接口
* @access public
* @param array $log 日志信息
* @return bool
*/
public function save(array $log = [])
{
$logArr = [];
foreach ($log as $type => $msgArr){
foreach ($msgArr as $msg){
$logArr[] = [
"type" => $type,
"msg" => $msg,
"addtime" => date("Y-m-d H:i:s"),
];
}
}
// dump($logArr);
$result = $this->db->table("logs")->insertAll($logArr);
dump($result);
return true;
}
}
数据库表自己创建,就三个字段 "type","msg" ,"addtime"
然后就可以使用了
当然也可以修改驱动类来存储到别的介质中,如redis
日志授权/过滤
在项目上线运行后,每天都会有大量的无用的日志保存在本地,这个无用的日志信息既占用了我们宝贵的服务器资源,又给我们的运维工作带来不便。在Thinkphp5官方给我们提供了一个日志授权的功能,通过这个日志授权功能,我们就可以只记录某些特定的日志信息,极大的提高了网站的运行性能和减去了多余的日志文件。
'log' => [
// 日志记录方式,内置 file socket 支持扩展
// 'type' => 'File',
'type' => '\\log\\Mysql',
// 日志保存目录
'path' => LOG_PATH,
// 日志记录级别
'level' => [],
// 授权只有127.0.0.1 才能记录日志
//'allow_key' => ['127.0.0.1'],
//只记录某些日志
'allow_key' => ['Index/index','Index/c'],
],
然后编写控制器基类,其他的控制器要继承这个,在初始化方法中添加日志的key,save方法还会自动判断存哪些
不过一般这个key我们不会写死,会写成下面的方式
Log::key($this->request->controller()."/".$this->request->action());