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

8

我想在不必为每个作业方法添加它的情况下,将Hangfire JobId(和其他属性)添加到所有作业中。

在Startup.cs中,我添加了一个有前途的过滤器解决方案,但我不知道如何将其应用于我的测试方法,而且我甚至不确定这是否是正确的方法。

Startup.cs

...
GlobalJobFilters.Filters.Add(new JobLoggerAttribute());
JobLoggerAttribute类 - 来自这里:链接 我的任务是在不手动添加到测试方法的情况下,在当前空白单元格中放置JobId: enter image description here Program.cs(全局定义的Logger):
Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(configuration)
                .WriteTo.Elasticsearch....
                .Enrich.FromLogContext()
                .CreateLogger();

因为我也想检索方法名等信息,所以我添加了这个类来调用我的作业中的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)
                ;
        }
    }

RunTestTask:

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));
        }

任务队列:

BackgroundJob.Enqueue(() => new Jobs.Test.TestService().RunTestTask(null));

希望能获得技巧和窍门。

谢谢。

1个回答

2

现在回答这个问题已经太晚了,而且我对Hangfire和Serilog这两个工具都不是专家。在我的情况下,我将Serilog与Seq结合使用,我的目标是将作业ID属性添加到从Hangfire作业写入的所有日志中。下面是我用来实现此目标的代码:

public class CustomBackgroundJobPerformer : IBackgroundJobPerformer
{
    private readonly BackgroundJobPerformer _innerPerformer;

    public CustomBackgroundJobPerformer(BackgroundJobPerformer innerPerformer)
    {
        _innerPerformer = innerPerformer;
    }

    public object Perform(PerformContext context)
    {
        using (LogContext.PushProperty("JobId", context.BackgroundJob.Id))
        {
            return _innerPerformer.Perform(context);
        }
    }
}

现在我们需要注册它,但是根据这个链接,为了应用我们的更改,我们需要注册所有接口 - IBackgroundJobFactory、IBackgroundJobStateChanger和IBackgroundJobPerformer。

    public void ConfigureServices(IServiceCollection services)
    {
      ...
       services.TryAddSingleton<IBackgroundJobFactory>(x => new BackgroundJobFactory(x.GetRequiredService<IJobFilterProvider>()));

        services.TryAddSingleton<IBackgroundJobPerformer>(x => new CustomBackgroundJobPerformer(
            new BackgroundJobPerformer(
                x.GetRequiredService<IJobFilterProvider>(),
                x.GetRequiredService<JobActivator>(),
                TaskScheduler.Default)));

        services.TryAddSingleton<IBackgroundJobStateChanger>(x => 
                new BackgroundJobStateChanger(x.GetRequiredService<IJobFilterProvider>()));

        ...
      }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接