加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-core – 丰富Serlilogs,每个hangfire工作具有独特的价值

发布时间:2020-12-16 09:33:12 所属栏目:asp.Net 来源:网络整理
导读:我正在使用Hangfire进行后台工作,而使用Serilog进行日志记录.我正在尝试使用TrackingId丰富我的serilogs,以便来自特定Hangfire作业的所有日志都具有我可以过滤的相同TrackingId. 我在Startup.cs中配置了这样的Serilog: Log.Logger = new LoggerConfiguratio
我正在使用Hangfire进行后台工作,而使用Serilog进行日志记录.我正在尝试使用TrackingId丰富我的serilogs,以便来自特定Hangfire作业的所有日志都具有我可以过滤的相同TrackingId.

我在Startup.cs中配置了这样的Serilog:

Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(Configuration)
    .WriteTo.Seq(serverUrl: serverUrl,apiKey: apiKey)

    // Enrich the logs with a tracking id. Will be a new value per request
    .Enrich.WithProperty("TrackingId",Guid.NewGuid())

    .CreateLogger();

我排队这样的工作:

BackgroundJob.Enqueue<MyService>(myService => myService.DoIt(someParameter));

但是这样做不会为每个Hangfire工作设置单独的TrackingId.有什么办法可以实现吗?

解决方法

为了它的价值,我最终使用下面显示的服务器/客户端过滤器和GlobalJobFilters注册将其关闭.我遇到的一个令人烦恼的问题是,AutomaticRetryAttribute默认添加到GlobalJobFilters集合,而 will log errors for failed jobs类则不知道在我们的自定义JobLoggerAttribute中创建的Serilog LogContext.就个人而言,我知道我只允许手动重试,所以我只删除了该属性并处理了IServerFilter.OnPerformed方法中的错误.检查我的帖子的结尾,看看如果它适合你,如何删除它.

如果要允许自动重试,则需要:1)创建一个自定义属性来装饰AutomaticRetryAttribute并使其知道自定义LogContext,2)再次从GlobalJobFilters集合中删除默认的AutomaticRetryAttribute,并且3)添加你的decorator属性集合.

public class JobLoggerAttribute : JobFilterAttribute,IClientFilter,IServerFilter
{
    private ILogger _log;

    public void OnCreating(CreatingContext filterContext)
    {
        _log = GetLogger();

        _log.Information("Job is being created for {JobType} with arguments {JobArguments}",filterContext.Job.Type.Name,filterContext.Job.Args);
    }

    public void OnCreated(CreatedContext filterContext)
    {
        _log.Information("Job {JobId} has been created.",filterContext.BackgroundJob.Id);
    }

    public void OnPerforming(PerformingContext filterContext)
    {
        if (_log == null)
            _log = GetLogger();

        _log.Information("Job {JobId} is performing.",filterContext.BackgroundJob.Id);
    }

    public void OnPerformed(PerformedContext filterContext)
    {
        _log.Information("Job {JobId} has performed.",filterContext.BackgroundJob.Id);

        if (filterContext.Exception != null)
        {
            _log.Error(
                filterContext.Exception,"Job {JobId} failed due to an exception.",filterContext.BackgroundJob.Id);
        }

        _log = null;
    }

    private ILogger GetLogger()
    {
        return Log.ForContext(GetType()).ForContext("HangfireRequestId",Guid.NewGuid());
    }
}

注册……

GlobalJobFilters.Filters.Add(new JobLoggerAttribute());

删除AutomaticRetryAttribute …

var automaticRetryFilter = GlobalJobFilters.Filters.Where(x => x.Instance is AutomaticRetryAttribute).Single();
GlobalJobFilters.Filters.Remove(automaticRetryFilter.Instance);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读