在TP6框架下,日志文件的读写操作非常重要,而这一点,在我们的编程开发中往往容易被忽略,所以网上关于这方面的讨论不多。本文主要针对我们项目开发过程中遇到的这方面问题做总结,记录踩过的坑,标记遇到的雷,以供记录和备忘。
ThinkPHP框架每个版本对日志文件的读写操作都不一样,版本升级没有连续性,对应的log的配置文件也各异,这点与WordPress不同。WordPress虽然版本升级很快,而且现在完全抛弃了PHP 5.X系列,只支持PHP 7.0及以上,但是每个版本升级,向下兼容性都做得非常好,包括数据库表结构的升级,都有对应的自动脚本,这一点,国内的程序员的确需要多向人家学习,取长补短。
在TP6框架下,日志文件的读写操作非常重要,而这一点,在我们的编程开发中往往容易被忽略,所以网上关于这方面的讨论不多。本文主要针对我们项目开发过程中遇到的这方面问题做总结,记录踩过的坑,标记遇到的雷,以供记录和备忘。
日志文件输出目录
TP6的日志文件的主要配置文件在config目录下的log.php中,默认的配置中,日志文件的默认保存路径为:
runtime/index/log/20xx.xx.xx.log
其中的index为子应用(多应用模式下,对应TP3.1中的group组)的名称,不同的子应用名称不同,例如app_name,app001等。
但是我们平时会将多个应用作为一个项目管理,不同的子应用的日志写在不同的目录下,查看和维护很不方便,特殊是需要综合分析一个请求的处理过程,基本都是后端程序员的事情,分散的日志反而不利于发现问题。
那么有什么方式可以将日志集中到统一的日志文件中呢?其实,在ThinkPHP6.0的框架下,可以通过修改config目录下的log.php来实现,设置指定日志文件目录的设置项为“channel/file/path”。
<?php
// +----------------------------------------------------------------------
// | 日志设置
// +----------------------------------------------------------------------
return [
// 默认日志记录通道
'default' => env('log.channel', 'file'),
// 日志记录级别
'level' => ['emergency','alert','critical','error','warning','notice','info','debug','sql'],
// 日志类型记录的通道 ['error'=>'email',...]
'type_channel' => [],
// 关闭全局日志写入
'close' => false,
// 全局日志处理 支持闭包
'processor' => null,
// 日志通道列表
'channels' => [
'file' => [
// 日志记录方式
'type' => 'File',
// 日志保存目录
'path' => app()->getRootPath().'runtime/log/',
// 单文件日志写入
'single' => false,
// 独立日志级别
'apart_level' => [],
// 最大日志文件数量
'max_files' => 100,
// 使用JSON格式记录
'json' => false,
// 日志处理
'processor' => null,
// 关闭通道日志写入
'close' => false,
// 日志输出格式化
'format' => '[%s][%s] %s',
// 是否实时写入
'realtime_write' => true,
],
// 其它日志通道配置
],
];
以上最关键的项目是“path”这个设置项,用到的函数“app()->getRootPath()”可以自动获取项目运行的硬盘的物理路径,其中的app()是TP6框架中的超级函数。
与TP3.1不同,在TP6中引入日志通道的概念,通过“type_channel”可以将不同的日志使用不同的通道,配置示例如下:
return [
'default' => 'file',
'type_channel' => [
'error' => 'email',
'sql' => 'sql',
],
'channels' => [
'file' => [
'type' => 'file',
],
'email' => [
'type' => 'email',
],
'sql' => [
'type' => 'sql',
],
],
];
如果日志类型为error,则使用email这个通道;如果日志类型为sql,则使用sql这个通道(channel) 。同时,你可以在写日志的时候,使用不同的通道,例如:
Log::channel('email')->info('一条测试日志');
Log::channel('socket')->error('记录错误日志');
写日志文件
写日志文件最常用的代码为:
Log::write('测试日志信息,这是警告级别,并且实时写入','notice');
日志文件的默认级别为“info”,通过write方式实时写入文件;也可以通过record和save来通过内存方式提高写日志的效率。
Log::record('测试日志信息,这是警告级别','notice');
Log::save();
ThinkPHP对系统的日志按照级别来分类记录,按照 PSR-3 日志规范,日志的级别从低到高依次为: debug , info , notice , warning , error , critical , alert , emergency , ThinkPHP额外增加了一个 sql 日志级别仅用于记录 SQL 日志(并且仅当开启数据库调试模式有效)。
以上是日常主要的写日志方式,参考TP6的使用手册,框架同时提供了助手函数trace,具体使用方式为:
trace('这是一条日志记录');
使用此方法写日志更简单,不需要use相关的package,建议采用。除了trace函数之外,ThinkPHP 6.0还提供了很多助手函数,另文说明。
2022年05月22日 2:17 下午 沙发
这个框架功能还是比较强大的!
2022年06月12日 1:23 下午 板凳
好文章!