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