Laravel 中如何以 JSON 格式记录日志?

Laravel 底层使用 Monolog,通过在 config/logging.php 中创建自定义 channel 并指定 JSON formatter 实现 JSON 日志输出。本文给出完整配置步骤。

最佳实践
Laravel 中如何以 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 防止日志无限增长。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台