Hangfire:全局添加 JobId 以记录到 Serilog

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)

希望得到提示和技巧。

谢谢。

Mta*_*aby 2

现在回答这个问题已经太晚了,而且我也不是这两个工具(Hangfire 和 Serilog)的专家,就我而言,我将 Serilog 与 Seq 结合使用,我的目标是将 Job Id 属性添加到从 Hangfire 写入的所有日志中作业,这是我用来实现此目的的代码

\n
public 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}\n
Run 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      }\n
Run Code Online (Sandbox Code Playgroud)\n