You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:01:05