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

如何将Doctrine异常信息记录至日志?

解决Cron任务中捕获Doctrine异常信息的问题

核心实现方案

要在Cron任务里获取Doctrine的详细错误信息,需精准捕获Doctrine专属异常,并结合Monolog输出完整异常上下文:

1. 针对性捕获Doctrine异常

不要仅捕获通用Exception,优先捕获Doctrine的具体异常类,拿到更精准的错误信息:

try {
    // 执行数据库增改操作
    $entityManager->persist($targetEntity);
    $entityManager->flush();
} catch (\Doctrine\DBAL\Exception $dbalException) {
    // 获取Doctrine原生错误信息、数据库错误码及完整调用栈
    $errorDetails = [
        'error_message' => $dbalException->getMessage(),
        'db_error_code' => $dbalException->getCode(),
        'trace' => $dbalException->getTraceAsString()
    ];
    // 记录到Monolog
    $logger->error('Cron任务数据库操作失败', $errorDetails);
} catch (\Doctrine\ORM\ORMException $ormException) {
    $logger->error('Cron任务ORM操作异常', [
        'message' => $ormException->getMessage(),
        'trace' => $ormException->getTraceAsString()
    ]);
} catch (\Exception $e) {
    // 兜底捕获其他异常
    $logger->error('Cron任务执行异常', [
        'message' => $e->getMessage(),
        'trace' => $e->getTraceAsString()
    ]);
}

2. 配置Monolog输出完整上下文

确保Monolog配置开启异常栈信息记录,示例配置如下:

monolog:
    handlers:
        cron_error:
            type: stream
            path: "%kernel.logs_dir%/cron_error.log"
            level: error
            formatter: monolog.formatter.line
            process_psr_3_messages: true

3. 验证效果

触发数据库错误(如重复键约束、字段长度超限)后,查看日志文件,即可得到包含Doctrine原生错误信息、错误码及调用栈的完整日志,与你期望的格式一致。

关键注意事项

  • 必须记录getTraceAsString()的结果,方便定位Cron任务中的代码问题
  • 确保Cron任务执行环境的日志目录有写入权限,且Monolog配置在CLI环境下正常加载

内容的提问来源于stack exchange,提问作者Vincent B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:35:36