Monolog发送错误日志邮件每次多发一封调试邮件,生产环境如何解决
问题原因
你配置的symfony_mailer handler的最低处理级别为debug,当fingers_crossed handler被critical级别的错误触发后,会收集所有级别≥debug的日志并投递。错误邮件发送完成后,Symfony Mailer组件本身会输出两行SMTP传输停止的DEBUG级日志,这部分日志刚好被激活的Monolog handler捕获,因此触发了第二封额外的邮件。
解决方法
你可以任选以下任意一种方案修复问题:
方案1(最推荐):调高邮件handler的最低日志级别
生产环境通常不需要把debug级别的日志发送到邮箱,直接将symfony_mailer handler的level从debug调整为error或更高的critical即可,DEBUG级别的SMTP日志会直接被过滤掉,不会触发邮件发送。
修改后的配置参考:
# config/packages/prod/monolog.yaml monolog: handlers: main: type: fingers_crossed action_level: critical handler: deduplicated deduplicated: type: deduplication handler: symfony_mailer symfony_mailer: type: symfony_mailer from_email: 'error@example.com' to_email: 'error@example.com' subject: 'An Error Occurred! %%message%%' level: error # 此处将debug改为error或critical
方案2:新增过滤规则排除Mailer相关调试日志
如果你确实需要保留debug级别的日志投递,可以新增一个filter类型的handler,过滤掉包含SMTP传输相关关键词的日志:
# config/packages/prod/monolog.yaml monolog: handlers: main: type: fingers_crossed action_level: critical handler: deduplicated deduplicated: type: deduplication handler: filter_mailer_logs # 新增过滤handler,排除Mailer调试日志 filter_mailer_logs: type: filter handler: symfony_mailer exclusion_patterns: - '/^Email transport/' symfony_mailer: type: symfony_mailer from_email: 'error@example.com' to_email: 'error@example.com' subject: 'An Error Occurred! %%message%%' level: debug
方案3:关闭Mailer组件的日志记录
直接在框架配置中关闭Mailer组件的日志输出,从根源上避免这部分日志被Monolog捕获:
# config/packages/framework.yaml framework: mailer: dsn: '%env(MAILER_DSN)%' logging: false
内容的提问来源于stack exchange,提问作者virtualize
相关产品推荐
相关产品推荐

