Hangfire.HttpJob 日志与进度条可视化实战:任务执行过程在Dashboard上一览无余
Hangfire.HttpJob 日志与进度条可视化实战:任务执行过程在Dashboard上一览无余
【免费下载链接】Hangfire.HttpJobhttpjob for Hangfire,restful api for Hangfire,job调度与业务分离项目地址: https://gitcode.com/gh_mirrors/ha/Hangfire.HttpJob
Hangfire.HttpJob 是一个将"job调度与业务分离"的开源框架,它把 Hangfire 的作业调度能力封装成了 RESTful API,同时提供了一套日志与进度条可视化能力:无论任务运行在哪个 JobAgent 进程里,日志、错误、进度条都会实时回传并在 Dashboard 上一览无余。本文面向新手,带你用最短的时间看懂这套可视化机制,并跑通第一个带日志和进度条的任务。
🧭 为什么需要日志与进度条可视化?
传统分布式任务调度最常见的痛点就是"黑盒":任务失败了不知道卡在哪一步、日志散落在各个服务器、进度只能靠猜。Hangfire.HttpJob 通过Agent 模式解决了这个问题——业务代码写在独立的 Agent 进程里,执行过程中的每一条日志、每一个进度条更新,都会被收集并写入存储,最终呈现在 Hangfire Dashboard 的作业详情页上。
上图就是一个已经执行完成的 HttpJob 详情页:左侧能看到任务的完整执行代码,右侧状态区显示"Succeded"、耗时统计,下方的 Processing 区域则逐条展示 Agent 回传的执行日志(最后一行输出 "success"),整个执行过程完全透明。
📝 一行代码输出彩色日志:从 Agent 到 Dashboard
Hangfire.HttpJob 的日志可视化入口是JobContext.Console。在继承JobAgent的业务类里,通过jobContext.Console就能输出日志,而且支持颜色区分,方便在 Dashboard 上快速定位问题:
Console.Info(...):白色普通信息Console.Warning(...):黄色警告Console.Error(...):红色错误
日志的写入实现在 HangfireConsole.cs,每条日志都会被记录时间偏移量(TimeOffset),这样 Dashboard 上能按时间轴精确还原任务的执行节奏。你可以在 TestHangfireAgent 的 TestJob.cs 里看到最典型的三连调用:
jobContext.Console.Info("info消息"); jobContext.Console.Warning("waring消息"); jobContext.Console.Error("error消息");日志回传与存储的完整链路涉及 ConsoleLine.cs(定义单条日志的结构:时间、内容、颜色、引用标记)和 ConsoleInfo.cs(记录存储用的 HashKey、SetKey 与任务开始时间)。
📊 进度条可视化:让长任务不再"假死"
对于耗时任务,用户最怕的是"不知道进度"。Hangfire.HttpJob 提供了与 Hangfire 官方一致的进度条 API——jobContext.Console.WriteProgressBar(name),返回一个进度条对象,用SetValue(0~100)即可实时更新:
var bar = jobContext.Console.WriteProgressBar("testbar"); for (int i = 0; i < 10; i++) { bar.SetValue(i * 10); // 每步更新10% await Task.Delay(1000); }进度条的核心实现位于 HangfireProgressBar.cs:值域强制校验在 0~100 之间,只有值真正变化时才写入(避免无意义的存储写入)。配合 JobContext.cs 中提供的GetParameter<T>、CancelToken等能力,你可以在长任务里实时汇报"第 N/M 步",也可以在用户手动取消时优雅退出。
通过 Dashboard 的"新增常规作业"弹窗,可以用 JSON 直接配置一个 HttpJob 的 URL、Method、Data、延迟分钟数、超时时间等参数;而 Agent 模式的任务则完全由代码控制日志与进度,两者在 Dashboard 上的呈现是统一的。
🔁 长驻任务日志:While 循环里也能持续回传
有些任务不是"执行一次就结束",而是持续运行的守护型任务(比如消费队列)。Hangfire.HttpJob 用[HangJobUntilStop]特性支持这种场景,参考 TestHangJob.cs:
[HangJobUntilStop(RegisterName = "HangJob测试")] public class TestHangJob : JobAgent { public override async Task OnStart(JobContext jobContext) { while (!jobContext.CancelToken.IsCancellationRequested) { jobContext.Console.Info("dddd"); await Task.Delay(1000 * 10); } jobContext.Console.Warning("game over"); } }任务每 10 秒输出一条日志,全部实时可见;当用户在 Dashboard 上停止任务时,CancelToken会触发取消,循环退出后输出 "game over"。这就是"任务执行过程在 Dashboard 上一览无余"的典型长驻场景。
对于周期性任务,同样可以在 Dashboard 上配置 Cron 表达式,执行过程中的日志与进度条更新会与普通任务一样呈现在详情页中。
🗄️ 日志存哪里?五种存储后端随你选
日志与进度条数据不是随便丢的,而是写入你指定的存储。Hangfire.HttpJob.Agent 提供了多种现成实现,只需引入对应 NuGet 包并注册即可:
| 存储类型 | 项目目录 | 说明 |
|---|---|---|
| MySQL | Hangfire.HttpJob.Agent.MysqlLog | MysqlConsole 实现 |
| MSSQL | Hangfire.HttpJob.Agent.MssqlConsole | SqlServer 存储 |
| PostgreSQL | Hangfire.HttpJob.Agent.PostgreSqlConsole | 对应 PostgreSqlHangfire 测试工程 |
| Redis | Hangfire.HttpJob.Agent.RedisConsole | RedisConsole 实现 |
Test 目录下有对应的完整可运行示例(如 TestHangfireAgent),照葫芦画瓢即可快速起一个带日志可视化的 Agent。
🚀 三步跑通你的第一个可视化任务
- 准备一个 Agent 项目:参考 TestHangfireAgent/Startup.cs,调用
services.AddHangfireJobAgent()注册服务、app.UseHangfireJobAgent()挂载中间件。 - 写一个带日志和进度条的 Job:继承
JobAgent,在OnStart里用jobContext.Console输出日志、用WriteProgressBar更新进度。 - 在 Dashboard 上执行并观察:创建作业(可参考 pic2、pic4 的 JSON 配置),执行完成后打开详情页,就能看到完整的彩色日志、进度条与耗时统计。
💡 小结
Hangfire.HttpJob 把"调度"和"业务"彻底分离:调度交给 Hangfire 服务端,业务跑在独立的 Agent 进程里,而日志与进度条可视化就是连接两端的透明窗口。对普通用户来说,你不需要关心底层存储的 HashKey、SetKey 是怎么组织的——只需要记住jobContext.Console这一个入口,就能让任务的每一步执行都清清楚楚地呈现在 Dashboard 上。
如果你正在为"任务黑盒"发愁,不妨用 Hangfire.HttpJob 的日志与进度条可视化能力,让每一次执行都有迹可循、一目了然。
【免费下载链接】Hangfire.HttpJobhttpjob for Hangfire,restful api for Hangfire,job调度与业务分离项目地址: https://gitcode.com/gh_mirrors/ha/Hangfire.HttpJob
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
