rat*_*lko 8 c# serilog hangfire
我正在尝试将 Hangfire JobId (和其他属性)添加到我的所有作业中,而不必将其添加到每个作业方法中。
在 Startup.cs 中,我添加了一个有前途的过滤器解决方案,但是我不知道如何将其应用到我的测试方法中,我什至不确定这是否是正确的方法。
启动.cs
...
GlobalJobFilters.Filters.Add(new JobLoggerAttribute());
Run Code Online (Sandbox Code Playgroud)
JobLoggerAttribute类 - 来自此处: 链接
我的任务是将 JobId 放置在列单元格当前为空白的位置,而无需手动将其添加到我的测试方法中:

Program.cs(全局定义的Logger):
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.WriteTo.Elasticsearch....
.Enrich.FromLogContext()
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
因为我还想检索方法名称等。我添加了这个类来调用我的工作中的 Here 方法。
LoggerExtensions.cs:
public static class LoggerExtensions
{
public static ILogger Here(this ILogger logger,
[CallerMemberName] string memberName = "",
[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0
)
{
return logger
.ForContext("MemberName", memberName)
.ForContext("FilePath", sourceFilePath)
.ForContext("LineNumber", sourceLineNumber)
;
}
}
Run Code Online (Sandbox Code Playgroud)
运行测试任务:
public void RunTestTask(PerformContext context)
{
// instead of having to write this line in all methods
// LogContext.PushProperty("JobId", context.BackgroundJob.Id);
Log.Logger.Here().Information(string.Format("Serilog: Hanfire Job {1} Scheduled at {0}", DateTime.Now, context.BackgroundJob.Id));
}
Run Code Online (Sandbox Code Playgroud)
作业排队:
BackgroundJob.Enqueue(() => new Jobs.Test.TestService().RunTestTask(null));
Run Code Online (Sandbox Code Playgroud)
希望得到提示和技巧。
谢谢。
现在回答这个问题已经太晚了,而且我也不是这两个工具(Hangfire 和 Serilog)的专家,就我而言,我将 Serilog 与 Seq 结合使用,我的目标是将 Job Id 属性添加到从 Hangfire 写入的所有日志中作业,这是我用来实现此目的的代码
\npublic class CustomBackgroundJobPerformer : IBackgroundJobPerformer\n{\n private readonly BackgroundJobPerformer _innerPerformer;\n\n public CustomBackgroundJobPerformer(BackgroundJobPerformer innerPerformer)\n {\n _innerPerformer = innerPerformer;\n }\n\n public object Perform(PerformContext context)\n {\n using (LogContext.PushProperty("JobId", context.BackgroundJob.Id))\n {\n return _innerPerformer.Perform(context);\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n现在我们需要注册它,但是根据此链接,要应用我们的更改,我们需要注册所有接口 \xe2\x80\x93 IBackgroundJobFactory、IBackgroundJobStateChanger 和 IBackgroundJobPerformer
\n public void ConfigureServices(IServiceCollection services)\n {\n ...\n services.TryAddSingleton<IBackgroundJobFactory>(x => new BackgroundJobFactory(x.GetRequiredService<IJobFilterProvider>()));\n\n services.TryAddSingleton<IBackgroundJobPerformer>(x => new CustomBackgroundJobPerformer(\n new BackgroundJobPerformer(\n x.GetRequiredService<IJobFilterProvider>(),\n x.GetRequiredService<JobActivator>(),\n TaskScheduler.Default)));\n\n services.TryAddSingleton<IBackgroundJobStateChanger>(x => \n new BackgroundJobStateChanger(x.GetRequiredService<IJobFilterProvider>()));\n\n ...\n }\nRun Code Online (Sandbox Code Playgroud)\n