首頁  >  文章  >  php框架  >  ThinkPHP6.0版本的日誌變化

ThinkPHP6.0版本的日誌變化

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼轉載
2019-12-16 13:41:507154瀏覽

ThinkPHP6.0版本的日誌變化

6.0的日誌類比先前版本完善了許多,主要新功能包括:

    ·日誌資訊格式化

    ·多通道寫入支援

    ·延遲/即時寫入

    ·日誌訊息處理事件

    ·#日誌層級指定頻道寫入

    ·支援關閉日誌/頻道

新版的日誌類別最大的變更就是支援多頻道寫入,也就是說你可以同時或為部分日誌類型增加另外的日誌通道寫入,例如對於某些異常日誌可以選擇傳送錯誤到郵件通知。

其它的變化主要包括:

    ·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('think\event\LogWrite', 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');

日志清空仅仅是清空内存中的日志。

自定义驱动

日志通道需要自定义日志驱动,该日志驱动需要实现think\contract\LogHandlerInterface接口。

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

众多ThinkPHP教程,尽在PHP中文网,欢迎在线学习!

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

以上是ThinkPHP6.0版本的日誌變化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:thinkphp.cn。如有侵權,請聯絡admin@php.cn刪除