Laravel 中如何以 JSON 格式记录日志?
Laravel 底层使用 Monolog,通过在 config/logging.php 中创建自定义 channel 并指定 JSON formatter 实现 JSON 日志输出。本文给出完整配置步骤。
核心思路:Laravel 底层是 Monolog,在 config/logging.php 中新建一个 channel,指定文件路径,然后通过 Log::channel('json') 或加入 stack 使用。JSON 格式化通过 Monolog 的 JsonFormatter 或 tap 配置实现。
配置步骤
编辑 config/logging.php,在 channels 中添加:
'json' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.json'),
'level' => 'debug',
'days' => 14,
'tap' => [App\Logging\JsonFormatter::class],
],
创建 app/Logging/JsonFormatter.php:
<?php
namespace App\Logging;
use Monolog\Formatter\JsonFormatter as MonologJsonFormatter;
class JsonFormatter
{
public function __invoke($logger)
{
foreach ($logger->getHandlers() as $handler) {
$handler->setFormatter(new MonologJsonFormatter());
}
}
}
使用
// 写入 JSON channel
Log::channel('json')->info('用户登录', ['user_id' => 42, 'ip' => '1.2.3.4']);
// 或加入 stack 让默认日志也走 JSON
// 'channels' => ['stack' => ['channels' => ['single', 'json']]]
观测云对照
Laravel 应用部署在服务器或容器中,观测云 DataKit 可直接采集日志文件或容器 stdout;JSON 格式的日志无需额外解析即可提取字段,在日志查看器中检索分析。
常见问题(FAQ)
Q:不改代码,已有日志能转 JSON 吗?
A:不能自动转换。已有日志是文本格式,需要用 Pipeline 的 grok 解析提取字段。新代码建议直接用 JSON。
Q:JSON 日志里能带异常堆栈吗?
A:可以。Monolog 的 JsonFormatter 会自动序列化异常信息(包括堆栈)到 JSON 的字段中。
Q:daily 和 single 驱动有什么区别?
A:daily 按天轮转(自动创建 laravel-2024-01-15.json),single 写入固定文件。生产环境建议用 daily 防止日志无限增长。