如何在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
相关产品推荐
相关产品推荐

