Symfony 3.4生产环境无法获取完整异常追踪信息求助
Symfony 3.4 迁移K8s后丢失异常完整追踪信息排查方案
问题现象
迁移至K8s环境后,Symfony 3.4的异常追踪仅显示web/app.php文件的行号,无法定位根因。示例报错:
Error: Call to a member function send() on null #0 web/app.php(19): null
本地连接生产数据库可正常获取完整追踪;生产环境启用app_dev.php测试仍无完整栈信息;新旧环境php -i输出无明显差异。当前Monolog配置:
monolog: handlers: main: type: rotating_file max_files: 10 path: '%kernel.logs_dir%/%kernel.environment%.general.log' level: INFO formatter: myapp.monolog.formatter.json_message
排查步骤
1. 验证PHP核心错误配置
K8s容器内的PHP实际生效配置可能与php -i输出存在差异,需重点检查:
- 执行命令确认配置:
php -c /path/to/your/php.ini -i | grep -E "error_reporting|log_errors|error_log" - 确保
error_reporting = E_ALL、log_errors = On,且error_log路径存在并对PHP进程(如www-data)有写入权限。
2. 检查app_dev.php的Debug模式
app_dev.php必须明确开启Debug模式才能输出完整栈信息:
// 确认第二个参数为true $kernel = new AppKernel('dev', true);
同时检查config_dev.yml中框架错误处理配置未被修改:
framework: error_controller: '@TwigErrorRenderer::showAction'
3. 排查Monolog自定义格式化器
自定义myapp.monolog.formatter.json_message可能在处理时丢弃了栈信息,临时替换为默认格式化器测试:
monolog: handlers: main: type: rotating_file max_files: 10 path: '%kernel.logs_dir%/%kernel.environment%.general.log' level: INFO # 注释自定义格式化器,使用默认 # formatter: myapp.monolog.formatter.json_message
若恢复完整追踪,需检查自定义格式化器的代码逻辑,确保保留exception字段的完整栈信息。
4. 检查OPcache优化配置
OPcache过高的优化级别可能破坏栈追踪的准确性,调整配置:
opcache.enable=1 opcache.optimization_level=0x7FFFBFFF # 关闭可能影响栈信息的优化项 opcache.save_comments=1 # 必须开启,否则会丢失注释关联的栈信息
调整后重启PHP-FPM或容器再测试。
5. 验证容器内文件权限
确保Symfony日志目录(var/logs)对PHP进程有写入权限:
# 容器内执行 ls -l var/logs
若权限不足,执行chown -R www-data:www-data var/logs调整。
6. 手动捕获异常验证栈信息
在app.php中添加手动捕获逻辑,直接打印栈信息到PHP错误日志:
try { $kernel = new AppKernel('prod', false); $request = Request::createFromGlobals(); $response = $kernel->handle($request); $response->send(); $kernel->terminate($request, $response); } catch (\Exception $e) { error_log($e->getTraceAsString()); throw $e; } catch (\Error $e) { error_log($e->getTraceAsString()); throw $e; }
查看PHP错误日志,若能获取完整栈,说明问题出在Symfony的异常处理或Monolog配置;若仍无完整栈,需排查PHP底层或K8s容器的运行环境。
内容的提问来源于stack exchange,提问作者Bouffe
相关产品推荐
相关产品推荐

