Laravel任务调度需构建可观测体系:为任务配置独立日志、捕获ScheduleFailed事件记录异常、用Totem实现Web化追踪、结合系统监控与告警。

要让 Laravel 任务调度(Scheduler)真正可监控,不能只靠“每分钟跑一次 schedule:run”,必须把执行过程、结果、异常都纳入可观测体系。核心思路是:记录输出 + 捕获异常 + 集中告警 + 可视化回溯。
给每个任务配置独立日志输出
在 app/Console/Kernel.php 的 schedule() 方法中,为关键任务显式指定日志路径,避免所有输出混在 laravel.log 里难以定位:
- 使用
output()写入专属日志文件:$schedule->command('backup:run')->daily()->at('03:00')->output('/storage/logs/backup.log'); - 用
append()追加而非覆盖,保留历史:->append() - 对闭包任务,手动加日志:
$schedule->call(function () { Log::info('cache:clear executed'); })->hourly(); - 确保
storage/logs/目录有写权限,且日志轮转已启用(logging.php中设'daily'驱动)
捕获并记录调度失败事件
Laravel 调度器本身不自动记录失败,需主动监听 ScheduleFailed 事件:
- 在 app/Providers/EventServiceProvider.php 的
$listen数组中添加:'Illuminate\Console\Events\ScheduleFailed' => ['App\Listeners\LogScheduleFailure'], - 生成监听器:
php artisan make:listener LogScheduleFailure --event=ScheduleFailed - 在监听器
handle()中记录错误详情:Log::error('Scheduled command failed', ['command' => $event->command, 'exception' => $event->exception->getMessage()]); - 该方式能捕获命令未找到、PHP 错误、数据库连接失败等各类中断场景
用 Totem 实现 Web 化任务管理与状态追踪
如果需要图形界面查看执行历史、手动触发、启停任务,Laravel-Totem 是最轻量实用的选择:
- 安装:
composer require lab404/laravel-totem - 发布迁移和配置:
php artisan vendor:publish --provider="Lab404\Totem\TotemServiceProvider",然后php artisan migrate - Totem 会自动记录每次任务执行的开始时间、结束时间、状态(成功/失败)、返回输出和异常堆栈
- 访问
/totem即可看到所有任务列表、最近执行记录、失败详情,并支持一键重试 - 它不替代原生 Scheduler,而是作为增强层运行在相同 Cron 基础上(仍需配置
* * * * * cd /path && php artisan schedule:run)
结合系统级监控做异常告警
日志和 Totem 解决“查得到”,但生产环境还需“及时知道”。建议组合以下方式:
- 用 logrotate 或 Laravel 日志驱动(如
stack+slack)将 ERROR 级别日志推送到通知渠道 - 写一个简单 Artisan 命令(如
monitor:schedule-health),检查最近 5 分钟内是否有失败记录或长时间无执行日志,配合 Cron 每 5 分钟跑一次并触发告警 - 若已接入 Sentry 或 Datadog,可在
ScheduleFailed监听器中调用Sentry\captureException()上报 - 避免依赖单一日志文件监控——比如用
tail -n 100 storage/logs/schedule.log | grep "failed"做脚本巡检,容易漏掉瞬时错误


















