gpt4 book ai didi

asp.net-core - 用每个 hangfire 作业的独特值(value)丰富 Serlilogs

转载 作者:行者123 更新时间:2023-12-03 17:49:53 37 4
gpt4 key购买 nike

我使用 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));

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

最佳答案

就其值(value)而言,我最终使用服务器/客户端过滤器和 GlobalJobFilters 将其关闭。注册如下图。我遇到的一个烦人的问题是 AutomaticRetryAttribute默认添加到 GlobalJobFilters集合,以及那个类(class) will log errors for failed jobs不知道在我们的自定义中创建的 Serilog LogContext JobLoggerAttribute .就我个人而言,我知道我只允许手动重试,所以我只是删除了该属性并处理了 IServerFilter.OnPerformed 中的错误。方法。如果这对您有用,请查看我帖子的末尾以了解如何将其删除。

如果您打算允许自动重试,那么您需要: 1) 创建一个自定义属性来装饰 AutomaticRetryAttribute并使其知道自定义 LogContext,2) 再次删除默认 AutomaticRetryAttribute来自 GlobalJobFilters集合,以及 3) 将您的装饰器属性添加到集合中。

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

关于asp.net-core - 用每个 hangfire 作业的独特值(value)丰富 Serlilogs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46771480/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com