Symfony 4生产环境Cron执行命令无法生成Monolog日志求助
问题分析与解决步骤
1. 修正Monolog配置,让生产日志写入文件
你的main处理器使用了fingers_crossed类型,它本身不会直接写入prod.log,而是将日志转发给handler字段指定的nested处理器。但当前nested的输出目标是php://stderr,所以日志只会流向标准错误流,不会写入日志文件。
修改config/packages/prod/monolog.yml,有两种可选方案:
方案一:保留缓冲功能(推荐)
维持fingers_crossed的缓冲机制,仅调整nested的输出路径:
monolog: handlers: main: type: fingers_crossed action_level: notice 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"]
方案二:直接写入日志(无缓冲)
如果不需要日志缓冲,将main改为stream类型直接写入文件:
monolog: handlers: main: type: stream path: '%kernel.logs_dir%/%kernel.environment%.log' level: notice formatter: monolog.formatter.json console: type: console process_psr_3_messages: false channels: ["!event", "!doctrine"]
2. 确保Cron任务以生产环境执行
Symfony控制台命令默认使用dev环境,Cron执行时必须显式指定--env=prod,否则会加载开发环境配置。示例Cron任务:
* * * * * cd /path/to/your/project && php bin/console app:my-command --env=prod >> /dev/null 2>&1
3. 修复目录权限问题
确认Cron执行用户对var/log目录有写入权限:
chown -R [cron执行用户]:[用户组] var/log chmod -R 755 var/log
4. 手动验证命令输出
在服务器终端直接执行命令,排查是否有日志输出或报错:
# 查看标准错误流输出 php bin/console app:my-command --env=prod 2>&1
内容的提问来源于stack exchange,提问作者K. Weber
相关产品推荐
相关产品推荐

