ThinkPHP6.0版本的日志變化

ThinkPHP6.0版本的日志變化

6.0的日志類比之前版本完善了很多,主要新特性包括:

????·日志信息格式化

????·多通道寫入支持

????·延時/實時寫入

立即學習PHP免費學習筆記(深入)”;

????·日志信息處理事件

????·日志級別指定通道寫入

????·支持關閉日志/通道

新版的日志類最大的變化就是支持多通道寫入,也就是說你可以同時或者給部分日志類型增加另外的日志通道寫入,例如對于一些異常日志可以選擇發送錯誤到郵件通知。

其它的變化主要包括:

????·WEB日志和CLI日志合并并統一格式;

????·默認不再記錄訪問信息,需要可以自己記錄;

????·獨立日志也支持JSON格式記錄;

日志的相關配置可以在config/log.php文件中設置,本篇主要描述下新版日志的變化。

日志通道

日志通道的概念相當于給日志信息做了一個日志空間,每個日志通道的日志信息采用獨立的寫入機制或者配置參數,你可以給日志信息指定默認的日志通道,也可以動態切換通道寫入,并且支持同一個日志信息同時寫入多個日志通道。

你可以在日志配置文件的channels配置中定義通道,默認僅定義了一個file通道。

//?日志通道列表 'channels'?????=>?[ ????'file'?=>?[ ????????//?日志記錄方式 ????????'type'???????????=>?'File', ????????//?日志保存目錄 ????????'path'???????????=>?'', ????????//?單文件日志寫入 ????????'single'?????????=>?false, ????????//?獨立日志級別 ????????'apart_level'????=>?[], ????????//?最大日志文件數量 ????????'max_files'??????=>?0, ????????//?使用JSON格式記錄 ????????'json'???????????=>?false, ????????//?日志輸出格式化 ????????'format'?????????=>?'[%s][%s]?%s', ????????//?是否實時寫入 ????????'realtime_write'?=>?false, ????], ????//?其它日志通道配置 ],

每個日志通道必須指定type參數,該參數決定了日志的寫入方式是什么,file就表示文件日志方式寫入,如果需要指定其它的寫入方式需要安裝額外的擴展。但你也可以給不同的日志通道指定相同的type,只是其它的配置參數不同,例如寫入的路徑不同之類。

無論使用什么日志寫入類型,每個日志通道可以支持的通用配置如下:

ThinkPHP6.0版本的日志變化

level參數的用法和全局日志配置一致,除了在命令行模式下,默認的日志都是在請求結束后統一一次性寫入,如果需要實時寫入日志信息需要設置。

'realtime_write'=>true,

如果在命令行下,無論是否設置都會自動實時寫入日志。

默認通道

通過設置default參數定義日志的默認通道,例如:

'default'=>'file',

級別通道

可以設置不同的日志級別使用不同的日志通道。

'type_channel'=>[ //?對于error日志級別?同時寫入file和email兩個日志通道 'error'=>['file','email'], ]

設置了級別通道后,該級別的日志不會記錄到默認通道,請注意。

日志通道需要日志驅動的配合,你也可以自定義日志驅動。

切換通道

你也可以手動切換當前的日志的默認寫入通道,例如:

Log::channel('email')->info('這是日志信息');

支持切換使用多個通道記錄,例如:

Log::channel(['email',?'file'])->info('這是日志信息');

日志處理

日志寫入支持事件監聽,例如:

Event::listen('thinkeventLogWrite',?function($event)?{ ????if('file'?==?$event->channel)?{ ????????$event->log['info'][]?=?'test?info'; ????} });

閉包的參數是LogWrite事件類對象實例,你可以獲取兩個屬性:

ThinkPHP6.0版本的日志變化

日志信息是一個二維數組,包含了當前日志通道下(允許記錄的)所有級別的日志信息。

格式化日志信息

系統提供了兩個參數用于日志信息的格式化,第一個是用于自定義時間顯示格式的time_format,第二個是調整日志輸出格式的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參數的第一個%s是日志記錄時間(日志時間的格式化由time_format參數定義) 第二個%s是日志級別 第三個%s是日志信息,順序不能調整。

JSON格式日志

可以支持JSON格式記錄文件日志,更加方便一些第三方日志分析工具進行日志分析。

在日志配置文件中,添加

return?[ ????'default'??????=>?'file', ????'channels'????=>????[ ????????'file'????=>????[ ????????????'type'??????????=>?'file',? ????????????'json'????????=>true ????????????'file_size'???=>?1024*1024*10,???? ????????], ????], ];

即可開啟JSON格式記錄,CLI命令行的日志記錄同樣有效。

和之前版本的區別在于,新版的每個日志信息都是一條JSON數據(舊版本是每個請求一條JSON數據)。

關閉日志

你可以通過調用close方法動態關閉日志寫入。

//?關閉全局日志寫入 Log::close(); //?關閉某個通道日志寫入 Log::close('file');

如果調用close方法動態關閉日志,會自動調用clear方法清空日志。

清空日志

一旦執行save方法后,內存中的日志信息就會被自動清空,如果需要提前清空日志可以使用:

//?清空所有日志 Log::clear(); //清空通道日志可以使用 Log::clear('file');

在清空日志方法之前,你可以使用getLog方法獲取內存中的日志。

//?獲取(默認通道)日志 $logs?=?Log::getLog(); //?獲取指定通道日志 $logs?=?Log::getLog('file');

日志清空僅僅是清空內存中的日志。

自定義驅動

日志通道需要自定義日志驅動,該日志驅動需要實現thinkcontractLogHandlerInterface接口。

interface?LogHandlerInterface { ????/** ?????*?日志寫入接口 ?????*?@access?public ?????*?@param??array?$log?日志信息 ?????*?@return?bool ?????*/ ????public?function?save(array?$log):?bool; }

眾多ThinkPHP教程,盡在PHP中文網,歡迎在線學習!

本文轉自:https://blog.thinkphp.cn/1186947

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享