如何将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.
相关产品推荐
相关产品推荐

