Symfony 7应用中Monolog无法写入prod.log日志求助
Symfony 7 生产环境 Monolog 日志失效排查方案
1. 检查日志目录权限
生产环境下,Web 服务器进程(如 www-data、apache 或 nginx 用户)需要对 var/logs 目录有写入权限:
- 修改目录所属用户:
chown -R www-data:www-data var/ - 或调整目录权限(确保组用户拥有写入权限):
chmod -R 775 var/logs/
2. 清除生产环境缓存
修改 Monolog 配置后,必须清除生产环境缓存以确保新配置生效:
php bin/console cache:clear --env=prod --no-debug
3. 排查 FingersCrossed 处理器逻辑
当前生产环境使用 fingers_crossed 处理器,它会缓存日志直到达到指定 action_level 才批量写入:
- 可临时将其替换为
stream处理器直接写入日志,验证是否为处理器逻辑问题:when@prod: monolog: handlers: main: type: stream path: '%kernel.logs_dir%/%kernel.environment%.log' level: debug channels: ["!event"] - 替换配置后清除缓存,触发日志检查是否写入文件。
4. 验证 JSON 格式化器是否正常
当前配置使用 monolog.formatter.json,若日志内容包含无法序列化的对象(如资源、闭包),会导致日志写入失败:
- 临时移除格式化器配置,使用默认文本格式测试:
when@prod: monolog: handlers: nested: type: stream path: '%kernel.logs_dir%/%kernel.environment%.log' level: debug # 注释掉 JSON 格式化器配置 # formatter: monolog.formatter.json deprecation: type: stream channels: [deprecation] path: '%kernel.logs_dir%/%kernel.environment%.log' # 注释掉 JSON 格式化器配置 # formatter: monolog.formatter.json
5. 确认运行环境为生产环境
- 执行命令查看当前运行环境:
php bin/console debug:container --env=prod | grep APP_ENV - 或在控制器中临时输出环境信息(测试后删除):
public function testLog(LoggerInterface $logger) { $logger->error('Test error log'); dump($_ENV['APP_ENV']); // 确认输出为 prod die; }
6. 检查日志通道过滤规则
确保你的日志没有被通道规则排除:当前 main 处理器未设置 channels,默认接收所有通道;若手动指定了日志通道,需确认处理器是否包含该通道。
内容的提问来源于stack exchange,提问作者Prez
相关产品推荐
相关产品推荐

