Laravel 12任务调度需组合Horizon、日志配置与多模态队列构建监控体系:Horizon通过horizon:snapshot定时采集指标;任务需配置sendOutputTo、emailOutputOnFailure及onFailure回调;多队列支持差异化监控;laravel-tail可实现日志实时追踪。

Laravel 12 的任务调度本身不内置监控能力,但通过组合官方工具与生态扩展,可构建完整、可信、可追溯的监控体系。关键不在“有没有监控”,而在于如何把调度、执行、采集、展示四层链路对齐。
Horizon 是 Laravel 12 任务监控的事实标准
Horizon 不只是队列仪表盘,更是为 Laravel 调度任务(包括 schedule:run 触发的 Artisan 命令)提供统一监控入口的基础设施。Coolify 等基于 Laravel 构建的平台已验证:所有后台任务——部署、备份、巡检——只要走 Horizon 队列,就自动纳入指标采集范围。
- Horizon 会持续采样每分钟的作业吞吐量、等待时长、失败率等原始数据
- 这些数据不会自动成图,必须由
horizon:snapshot命令定时固化为快照(snapshot) - 快照存入 Redis 后,仪表盘才渲染趋势图表;过期快照按
metrics.trim_snapshots配置自动清理
⚠️ 注意:仅运行
php artisan horizon不会产生任何指标。必须在app/Console/Kernel.php的schedule()方法中注册:$schedule->command('horizon:snapshot')->everyFiveMinutes();
任务执行层需启用日志与异常捕获
调度器只负责“什么时候跑”,不保证“跑得怎么样”。要监控实际执行结果,需在任务定义中显式配置:
-
sendOutputTo():将命令输出写入指定日志文件,便于事后审计 -
emailOutputOnFailure():失败时自动邮件告警(需配置 Mail) -
onOneServer()+withoutOverlapping():防重复执行,避免监控误报 -
after()/onFailure()回调:可触发自定义监控上报(如向 Prometheus Pushgateway 推送指标)
例如:
$schedule->command('backup:database')
->dailyAt('03:00')
->sendOutputTo(storage_path('logs/backup.log'))
->emailOutputOnFailure('ops@example.com')
->onFailure(function ($task) {
\Log::error("Backup failed", ['task' => $task->getName()]);
// 可在此上报至 Sentry 或 StatsD
});多模态队列带来更细粒度的监控维度
Laravel 12 的多模态队列(如 vision、edge、realtime)支持按任务类型分流,这天然支持差异化监控:
- 为高优先级任务(如支付回调)启用更短的
timeout和更激进的重试策略,并单独配置告警阈值 - 对 AI 类长耗时任务(如图像识别),监控其
execution_time分位数而非仅成功/失败 - 使用
QUEUE_CONNECTION=vision php artisan queue:work --max-jobs=100启动专用 worker,并在 Horizon 中按 connection 分组查看负载
配置示例(config/queue.php):
'connections' => [
'vision' => [
'driver' => 'redis',
'connection' => 'default',
'block_for' => 5,
'retry_after' => 7200, // 2小时,适配AI任务
],
],补充轻量级日志追踪:Laravel Tail
对调度任务产生的日志,可用 laravel-tail 实现自动化盯屏式监控:
- 安装后发布配置:
php artisan vendor:publish --provider="La\LaravelTail\TailServiceProvider" - 修改
config/tail.php指向你的调度日志路径(如storage/logs/schedule.log) - 配合 systemd 或 supervisor 启动守护进程,实时捕获
schedule:run输出 - 支持关键词高亮(如
failed,Exception),并可配合脚本触发钉钉/企业微信通知
不复杂但容易忽略


















