6.0的日志类比之前版本完善了很多,主要新特性包括:
日志信息格式化
多通道写入支持
延时/实时写入
日志信息处理事件
日志级别指定通道写入
支持关闭日志/通道
新版的【de】日志类最大【dà】的变【biàn】化【huà】就是【shì】支持多通道写入,也【yě】就是说你可以【yǐ】同时或者给部【bù】分日【rì】志类型增加另外的【de】日志通道写入,例如对【duì】于一些异常日志可以选择发【fā】送错误到【dào】邮件【jiàn】通知。
其它的变化主要包括:
WEB日志和CLI日志合并并统一格式;
默认不再记录访问信息,需要可以自己记录;
独立日志也支持JSON格式记录;
日志【zhì】的相关【guān】配置可以在config/log.php文件中设置,本篇主【zhǔ】要【yào】描【miáo】述下新版日志的变化。
日志通【tōng】道【dào】的概念相当于给日【rì】志信【xìn】息做了一【yī】个日志空间,每个日志通【tōng】道的日志【zhì】信息采用独立【lì】的写入机制或者配置参【cān】数,你可以【yǐ】给日志【zhì】信【xìn】息指定默认【rèn】的日志通道,也可以动【dòng】态【tài】切换通【tōng】道写入,并【bìng】且支持【chí】同【tóng】一个日志信息同时写入多个日志通道。
你可【kě】以在日志配置文件的channels配置中定义通道,默【mò】认【rèn】仅定义了【le】一个【gè】file通道
// 日【rì】志通道列表 'channels' => [ 'file' => [ // 日志【zhì】记录方式 'type' => 'File', // 日志【zhì】保存目录 'path' => '', // 单文件【jiàn】日志【zhì】写入 'single' => false, // 独立日志级别 'apart_level' => [], // 最大日志【zhì】文件数量 'max_files' => 0, // 使用JSON格式记【jì】录 'json' => false, // 日志输出【chū】格【gé】式化 'format' => '[%s][%s] %s', // 是否实时写入【rù】 'realtime_write' => false, ], // 其它日志通【tōng】道【dào】配【pèi】置 ],
每个日志通道【dào】必须指定type参【cān】数【shù】,该参数决定了日志【zhì】的写入方【fāng】式是什么,file就表【biǎo】示文件日志方式写入,如果需【xū】要指定其它的写入方式【shì】需要安【ān】装【zhuāng】额外【wài】的扩展。但你【nǐ】也可以【yǐ】给不【bú】同的日志通道【dào】指【zhǐ】定【dìng】相同的type,只是【shì】其它的配置参数不同,例如写入的路【lù】径不同之【zhī】类。
无论使用什么日【rì】志写入类【lèi】型,每个日志通【tōng】道可【kě】以【yǐ】支持的通用配【pèi】置如下:
参数 | 说明 |
---|---|
level | 日志通道记录的日志级别 |
realtime_write | 日志是否实时写入 |
level参【cān】数【shù】的用法和全局日志配置一【yī】致【zhì】,除了在命【mìng】令【lìng】行模【mó】式下【xià】,默认的日志都是【shì】在请求结束后统一一次性写入,如果【guǒ】需要【yào】实时写入日志信息需要设置。
'realtime_write' => true,
如果在命令行下,无论是否设置都会自动实时写入日志。
通过设置default参数定义日志的默认通道,例如:
'default' => 'file',
可以设置不同的日志级别使用不同的日志通道
'type_channel' => [ // 对于error日志级别 同时【shí】写入file和email两【liǎng】个日志通【tōng】道 'error' => ['file','email'], ]
设置了级别通道后,该级别的日志不会记录到默认通道,请注意。
日志通道需要日志驱动的配合,你也可以自定义日志驱动。
你也可以手动切换当前的日志的默认写入通道,例如:
Log::channel('email')->info('这是日【rì】志信息【xī】');
支持切换使用多个通道记录,例如:
Log::channel(['email', 'file'])->info('这是日志【zhì】信息');
日志写入支持事件监听,例如。
Event::listen('think\event\LogWrite', function($event) { if('file' == $event->channel) { $event->log['info'][] = 'test info'; } });
闭包的【de】参数是LogWrite事件类对象实【shí】例【lì】,你可以获取两个【gè】属性【xìng】:
属性名 | 描述 |
---|---|
channel | 写入日志的通道名 |
log | 写入的日志信息 |
日志信息是一个【gè】二维数组,包含【hán】了当【dāng】前日志通道下【xià】(允许记【jì】录的)所有级别的【de】日【rì】志信息。
系统提【tí】供了两个参数用【yòng】于日志信息的格式化,第一个【gè】是用于【yú】自定义时间显示【shì】格式的【de】time_format,第二【èr】个是调【diào】整日志输出格式【shì】的format参数。
'channels' => [ 'file' => [ 'type' => 'file', 'json' => true 'file_size' => 1024*1024*10, 'time_format' => 'Y-m-d H:i:s', 'format' => '[%s][%s]:%s', ], ],
format参数【shù】的第一个%s是日志【zhì】记录时间【jiān】(日志时间的格式化由time_format参数定【dìng】义) 第【dì】二个%s是日志级别【bié】 第【dì】三个%s是日志【zhì】信息,顺序【xù】不能调整。
可以支持【chí】JSON格【gé】式记录文件【jiàn】日志,更加方【fāng】便一些第三方日志分析工【gōng】具进行日志分【fèn】析。
在日志配置文件中,添加
return [ 'default' => 'file', 'channels' => [ 'file' => [ 'type' => 'file', 'json' => true 'file_size' => 1024*1024*10, ], ], ];
即可开启JSON格式记录,CLI命令行的日志记录同样有效。
和之【zhī】前版本的区别在于,新版的每个日志【zhì】信【xìn】息都是【shì】一条【tiáo】JSON数据(旧版本是每个请求一条【tiáo】JSON数据)。
你可以通过调用close方法动态关闭日志写入。
// 关闭全【quán】局日【rì】志写入 Log::close(); // 关【guān】闭某个通道日志写【xiě】入 Log::close('file');
如果调用close方【fāng】法动态【tài】关【guān】闭日志,会【huì】自动调用clear方法清空【kōng】日志。
一旦执行save方法后,内存中【zhōng】的【de】日志信【xìn】息就会被自动清【qīng】空【kōng】,如果需【xū】要提前清空日【rì】志可以使用:
// 清【qīng】空所【suǒ】有日志【zhì】 Log::clear(); //清空通道日志可以使用 Log::clear('file');
在清空日【rì】志【zhì】方法之前,你【nǐ】可以使用getLog方法获取内存中的【de】日志。
// 获取(默认通道)日【rì】志 $logs = Log::getLog(); // 获取指【zhǐ】定通道日志【zhì】 $logs = Log::getLog('file');
日志清空仅仅是清空内存中的日志。
日志通【tōng】道需要自定义日志【zhì】驱动,该日志【zhì】驱动需要实现think\contract\LogHandlerInterface接【jiē】口。
interface LogHandlerInterface { /** * 日志【zhì】写入接口 * @access public * @param array $log 日【rì】志信【xìn】息 * @return bool */ public function save(array $log): bool; }