You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Symfony生产环境中保存Monolog info级日志?

问题:Symfony+Monolog无法将info级日志写入prod.log,仅错误日志正常

我使用最新版本的Symfony和Monolog,尝试了多种方法,始终无法将info级日志保存到prod.log或除dev.log外的其他日志文件中,只有错误日志可以正常写入prod.log。麻烦帮忙排查代码和配置是否存在问题?

Monolog配置(monolog.yaml)

when@prod:
    monolog:
        handlers:
            main:
                type: fingers_crossed
                action_level: warning
                handler: nested
                excluded_http_codes: [404, 405]
                buffer_size: 50 # How many messages should be saved? Prevent memory leaks
            nested:
                type: stream
                path: '%kernel.logs_dir%/%kernel.environment%.log'               
                level: debug
                formatter: monolog.formatter.json
            console:
                type: console
                process_psr_3_messages: false
                channels: ["!event", "!doctrine"]

控制器代码

#[Route('/test', name: 'app_test')]
public function index(LoggerInterface $logger): Response
{
    $logger->info('test');

    return $this->render('test/index.html.twig', [

    ]);
}

我曾尝试添加以下配置,但没有效果:

deprecation:
    type: stream
    level: info
    channels: [php]
    path: '%kernel.logs_dir%/deprecated.log'

问题分析

你的核心问题出在main handler的fingers_crossed类型配置上:

  • fingers_crossed是缓冲型处理器,它会先缓存所有低于action_level的日志,只有当出现等于或高于action_level的日志时,才会把缓冲的所有日志(包括低级别)一起传递给后续的nested处理器写入文件。
  • 你设置的action_level: warning,意味着只有当系统产生warning及以上级别的日志时,之前缓存的info日志才会被写入prod.log。如果没有触发warning,info日志会被直接丢弃,不会写入文件。

另外,你尝试添加的deprecation处理器仅针对php通道的日志,而控制器通过LoggerInterface记录的日志默认使用app通道,所以这个配置对你的测试日志完全无效。


解决方案

根据你的需求,提供两种常用处理方式:

方式1:调整缓冲触发级别(适合需要缓存低级别日志,直到错误发生才批量写入的场景)

将main处理器的action_level改为info,这样只要有info及以上级别的日志产生,就会触发缓冲日志的写入:

when@prod:
    monolog:
        handlers:
            main:
                type: fingers_crossed
                action_level: info # 修改此处
                handler: nested
                excluded_http_codes: [404, 405]
                buffer_size: 50
            nested:
                type: stream
                path: '%kernel.logs_dir%/%kernel.environment%.log'               
                level: debug
                formatter: monolog.formatter.json
            console:
                type: console
                process_psr_3_messages: false
                channels: ["!event", "!doctrine"]

方式2:新增独立处理器直接写入info日志(适合无需缓存,实时记录info级日志的场景)

如果不需要缓冲日志功能,希望实时记录info及以上级别的日志,可以直接将main处理器改为stream类型:

when@prod:
    monolog:
        handlers:
            main:
                type: stream # 替换为stream类型
                path: '%kernel.logs_dir%/%kernel.environment%.log'               
                level: info # 设置为info级别,记录info及以上所有日志
                formatter: monolog.formatter.json
            console:
                type: console
                process_psr_3_messages: false
                channels: ["!event", "!doctrine"]

或者保留fingers_crossed用于错误场景,同时新增一个独立处理器专门记录info日志:

when@prod:
    monolog:
        handlers:
            main:
                type: fingers_crossed
                action_level: warning
                handler: nested
                excluded_http_codes: [404, 405]
                buffer_size: 50
            nested:
                type: stream
                path: '%kernel.logs_dir%/%kernel.environment%.log'               
                level: debug
                formatter: monolog.formatter.json
            info_handler: # 新增info日志处理器
                type: stream
                path: '%kernel.logs_dir%/info.log' # 可单独写入info.log,或改为prod.log路径合并记录
                level: info
                formatter: monolog.formatter.json
            console:
                type: console
                process_psr_3_messages: false
                channels: ["!event", "!doctrine"]

内容的提问来源于stack exchange,提问作者4michal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:45:05