laravel artisan命令异常默认不写入日志,需确保异常冒泡、显式调用logger()记录或在handler.php中针对cli环境统一report;同时确认logging配置正确。

Laravel 命令行执行异常默认会输出到终端,但不会自动写入日志文件。要让 Artisan 命令的异常被记录到 Laravel 日志(如 storage/logs/laravel.log),关键在于确保异常未被静默捕获,并利用 Laravel 的异常处理机制。
确保命令未屏蔽异常传播
在自定义 Artisan 命令的 handle() 方法中,避免用空的 try-catch 吞掉异常,或手动调用 exit() 终止流程而绕过异常处理器:
- ❌ 错误写法(异常丢失):
try { /* 业务代码 */ } catch (\Exception $e) { } - ✅ 正确做法(让异常冒泡):
// 不 catch,或只 catch 后重新 throwcatch (\Exception $e) { logger()->error('命令执行失败', ['exception' => $e]); throw $e; }
使用 logger() 或 Log 主动记录
对可预期的错误分支(如数据不存在、外部 API 调用失败),推荐显式记录:
- 在
handle()中调用logger()->error('描述', ['context']) - 或使用门面:
\Log::error('订单同步失败', ['order_id' => $id]) - 日志级别可选:
info、warning、error、critical等,按严重性区分
全局捕获未处理异常(可选增强)
若需统一记录所有未被捕获的命令异常,可在 app/Console/Kernel.php 的 commands() 方法后补充:
- 重写
handle()方法(不推荐,易覆盖核心逻辑) - 更稳妥方式:在
app/Exceptions/Handler.php的report()方法中判断当前是否为 CLI 环境:if (app()->runningInConsole()) { logger()->error('CLI 异常', ['exception' => $exception]); }
验证日志配置生效
确认 config/logging.php 中默认 channel(如 stack)已启用且目标为 daily 或 single:'default' => env('LOG_CHANNEL', 'stack'),'channels' => ['stack' => ['driver' => 'stack', 'channels' => ['daily']] ]
运行命令后检查 storage/logs/laravel-xxx.log 是否有对应时间戳的 error 条目。











