logger 日志統(tǒng)籌化管理插件

為了后期更好的維護(hù),最新 2.0 版本已修改包名,請(qǐng)注意切換
webman-tech/logger
webman log 統(tǒng)籌化管理插件
簡(jiǎn)介
webman 支持原始的 monolog 配置形式,配置靈活,但是從以下情況來(lái)看不是特別便利:
- 當(dāng)日志特別多,不可能所有日志都通過(guò)
Log::info
的形式去記錄,肯定是需要分 channel 的 - 當(dāng) channel 特別多的時(shí)候:每個(gè)都要去單獨(dú)定義,但基本都是復(fù)制粘貼的,當(dāng)后期切換所有通道寫(xiě)入渠道時(shí),需要逐一修改,不太好維護(hù)
- 每次通過(guò)
Log::channel('channelName')
的形式去調(diào)用,因?yàn)?channelName
是字符串,萬(wàn)一單詞拼錯(cuò),會(huì)導(dǎo)致日志記錄不到 - 沒(méi)有很好的利用好 monolog 的 formatter 和 processor
此插件即為了解決以上問(wèn)題,針對(duì)多 channel
模式進(jìn)行統(tǒng)籌優(yōu)化管理
安裝
composer require webman-tech/logger
配置
-
主要的配置文件位于:
config/plugin/webman-tech/logger/log-channel.php
,按需調(diào)整,后文詳細(xì)對(duì)其中部分配置做說(shuō)明 -
(建議)自定義一個(gè) Logger 類繼承
WebmanTech\Logger\Logger
,比如support\facade\Logger
,便于后期擴(kuò)展和使用 -
(必須)在
config/log.php
中合并原來(lái)的配置和Logger::getLogChannelConfigs()
,例如:
use support\facade\Logger;
return array_merge(
[
'default' => [
'handlers' => [
[
'class' => Monolog\Handler\RotatingFileHandler::class,
'constructor' => [
runtime_path() . '/logs/webman.log',
7, //$maxFiles
Monolog\Logger::DEBUG,
],
'formatter' => [
'class' => Monolog\Formatter\LineFormatter::class,
'constructor' => [null, 'Y-m-d H:i:s', true],
],
]
],
],
],
Logger::getLogChannelConfigs(), // merge 這個(gè)
);
-
新增一個(gè)日志 channel,執(zhí)行以下兩步操作:
- (必須)在
config/plugin/webman-tech/logger/log-channel.php
的channels
中添加日志 channel 的名字,建議小駝峰命名,例如purchaseOrder
- (建議)在
support\facade\Logger
的類上方添加注釋:@method static void purchaseOrder($msg, string $type = 'info', array $context = [])
- (必須)在
步驟2是為了代碼提示,后期記錄日志可以直接使用 support\facade\Logger::purchaseOrder('xxx')
的形式,
如果未定義該類,一樣可以使用 support\Log::channel('purchaseOrder')->info('xxx')
的方式去記錄日志
后期新增其他 channel,只需要重復(fù)4即可
使用
假設(shè)已經(jīng)在 config/plugin/webman-tech/logger/log-channel.php
的 channels
中配置了兩個(gè) channels: app 和 sql,建議有如下 Logger 類:
<?php
namespace support\facade;
/**
* @method static void app($msg, string $type = 'info', array $context = [])
* @method static void sql($msg, string $type = 'info', array $context = [])
*/
class Logger extends \WebmanTech\Logger\Logger
{
}
記錄日志
use support\facade\Logger;
Logger::app('xxx'); // 記錄 xxx 到 app channel
Logger::app(['x' => 'y']); // 支持?jǐn)?shù)組寫(xiě)入,寫(xiě)入日志時(shí)會(huì)轉(zhuǎn)成 json
Logger::app($exception); // 支持 Exception 寫(xiě)入,寫(xiě)入時(shí)會(huì)記錄詳細(xì)的 trace
Logger::app('xxx', 'error'); // 切換 level
Logger::app('hello: {name}', 'info', ['name' => 'Kriss']); // 使用 PsrLogMessageProcessor 處理,會(huì)記錄成 "hello Kriss"
模式(Mode)介紹
模式基本等同于 monolog 的 Handler,基本來(lái)說(shuō)就是 Handler 的二次封裝,多個(gè)模式可以同時(shí)啟用,以下時(shí)已有的模式介紹
SplitMode
不同的channel分別會(huì)被記錄到不同的目錄下,目錄名和文件名均為 channel 同名,如:
- runtime
- logs
- app
- app-2022-05-28.log
- app-2022-05-29.log
- sql
- sql-2022-05-28.log
- sql-2022-05-29.log
此模式比較適合開(kāi)發(fā)和測(cè)試,按channel和日期分開(kāi)日志,方便排查錯(cuò)誤
MixMode
不同的channel會(huì)被記錄到同一個(gè)目錄下,目錄名和文件名均為 channelMixed(可修改),如:
- runtime
- logs
- channelMixed
- channelMixed-2022-05-28.log
- channelMixed-2022-05-29.log
- channelMixed
- logs
此模式比較適合將日志文件寫(xiě)入到 elk 等其他集中日志管理的服務(wù)中,因?yàn)橐话愦朔N通過(guò) agent 來(lái)收集日志的服務(wù)不太會(huì)兼容動(dòng)態(tài)擴(kuò)展的日志目錄
在 log 文件中如何區(qū)分 channel? 在記錄的日志中有一列是 [channelName]
StdoutMode
將所有日志輸出到控制臺(tái)
此模式適合 docker 環(huán)境
formatter 介紹
formatter 結(jié)構(gòu)化可以有效的方便日志的篩查和查看
ChannelFormatter
基本的通道格式
單行日志格式如下:
[時(shí)間][請(qǐng)求的唯一標(biāo)識(shí)][日志級(jí)別][客戶端ip][當(dāng)前登錄的用戶ID][路由path]: 日志內(nèi)容
ChannelMixedFormatter
mix mode 使用的格式,比 ChannelFormatter 多了一列 channelName
單行日志格式如下:
[時(shí)間][請(qǐng)求的唯一標(biāo)識(shí)][channelName][日志級(jí)別][客戶端ip][當(dāng)前登錄的用戶ID][路由path]: 日志內(nèi)容