Laravel多项目Syslog日志添加项目标识的便捷实现方法
解决Laravel多项目syslog日志区分问题
不用修改所有Log::debug/Log::error调用的话,咱们可以从Laravel的日志配置和Monolog底层入手,给日志统一加上项目标识,下面是两个简单可行的方案:
方案一:直接修改syslog通道的格式化规则
Laravel的日志系统基于Monolog,咱们可以直接在config/logging.php里给syslog通道配置自定义的格式化字符串,把项目名称(比如从.env的APP_NAME取)嵌进去。
- 打开
config/logging.php,找到syslog通道的配置块,添加formatter和formatter_with参数:
'syslog' => [ 'driver' => 'syslog', 'level' => env('LOG_LEVEL', 'debug'), // 指定用Monolog的LineFormatter 'formatter' => \Monolog\Formatter\LineFormatter::class, 'formatter_with' => [ // 自定义格式,末尾追加项目标识 'format' => '%channel%.%level_name%: %message% %context% %extra% [project: ' . env('APP_NAME') . ']', ], ],
每个项目的
.env里设置不同的APP_NAME,比如项目1设APP_NAME=project-one,项目2设APP_NAME=project-two。测试一下:执行
php artisan tinker然后Log::debug('test message');,去syslog里看,日志行末尾就会带上[project: xxx]的标识了。
方案二:自定义格式化器类(更灵活)
如果需要更复杂的格式调整,或者想把项目标识放在其他位置,可以自定义一个Monolog格式化器类,继承默认的LineFormatter然后追加标识。
- 在项目里创建
app/Logging/ProjectIdentFormatter.php文件:
<?php namespace App\Logging; use Monolog\Formatter\LineFormatter; class ProjectIdentFormatter extends LineFormatter { public function format(array $record): string { // 先调用父类生成默认格式的日志内容 $formattedLog = parent::format($record); // 去掉末尾的换行,追加项目标识后再加换行 return rtrim($formattedLog) . ' [project: ' . env('APP_NAME') . ']' . PHP_EOL; } }
- 回到
config/logging.php,把syslog通道的formatter改成咱们自定义的类:
'syslog' => [ 'driver' => 'syslog', 'level' => env('LOG_LEVEL', 'debug'), 'formatter' => \App\Logging\ProjectIdentFormatter::class, // 可选:如果需要自定义基础日志格式,保留这个参数 'formatter_with' => [ 'format' => '%channel%.%level_name%: %message% %context% %extra%', ], ],
- 同样给每个项目配置不同的
APP_NAME,测试后就能看到带项目标识的日志了。
这两个方案都不需要修改任何业务代码里的Log调用,只需要调整配置或添加一个小类,就能轻松区分多个项目的syslog日志啦。
内容的提问来源于stack exchange,提问作者alistaircol
相关产品推荐
相关产品推荐

