生产环境错误未写入prod.log文件问题求助
问题排查与解决方案
1. 检查文件权限
确保prod.log文件和%kernel.logs_dir%目录的权限正确,Web服务器进程(如www-data、nginx)需要具备写入权限。
- 可执行以下命令调整权限(根据实际日志路径修改):
chown www-data:www-data var/logs/prod.log chmod 664 var/logs/prod.log
2. 验证fingers_crossed Handler配置
生产环境的main handler为fingers_crossed类型,会缓冲日志直到达到action_level(当前为error)才写入,需确认:
- 500错误确实触发了
error及以上级别的日志输出(比如框架自动捕获的致命错误,或代码中主动调用$logger->error()) - 当前配置排除了404、405状态码,但500不在排除列表,此部分无问题
- 若进程在错误发生前意外终止,
buffer_size=50的缓冲日志会丢失。可临时修改配置,将mainhandler改为直接写入的stream类型测试:
测试500错误能否写入日志,判断是否为缓冲机制导致的问题。when@prod: monolog: handlers: main: type: stream path: "%kernel.logs_dir%/prod.log" level: error formatter: monolog.formatter.json # 暂时注释nested等其他handler # nested: # ...
3. 检查框架错误处理配置
确认Symfony的错误处理未抑制日志输出,查看config/packages/framework.yaml:
framework: error_handler: log_errors: true
确保log_errors设置为true。
4. 简化配置排除冲突
暂时移除deprecation等非核心handler,简化生产环境的Monolog配置,排除多handler间的冲突可能。
5. 手动触发日志测试
在生产环境代码中添加测试逻辑,主动触发错误日志:
// 示例:在控制器中添加测试方法 public function testProductionLog() { $this->logger->error('Production error log test'); throw new \Exception('Trigger 500 error'); }
访问该接口后查看prod.log,判断是日志系统问题还是错误触发环节的问题。
内容的提问来源于stack exchange,提问作者Toma Tomov
相关产品推荐
相关产品推荐

