C# 使用EventId丰富serilog日志

C# 使用EventId丰富serilog日志,c#,.net-core,serilog,C#,.net Core,Serilog,我想用eventId丰富我的日志,这样我就可以很容易地找到特定类型的事件。 我知道.netCore已经具有传递给的结构 因此,当我在代码中执行此操作时: _logger.LogInformation(_events.TestEvent,"Test logged."); 我想将eventId结构中的Id设置为日志的属性。 我尝试在ILogEventRicher类型的enricher上编写我的脚本,但无法从Serilog.Events.LogEvent类访问EventId结构

我想用eventId丰富我的日志,这样我就可以很容易地找到特定类型的事件。 我知道.netCore已经具有传递给的结构

因此,当我在代码中执行此操作时:

_logger.LogInformation(_events.TestEvent,"Test logged.");
我想将eventId结构中的Id设置为日志的属性。 我尝试在ILogEventRicher类型的enricher上编写我的脚本,但无法从Serilog.Events.LogEvent类访问EventId结构

还有别的办法吗

我每次都必须像这样将自定义属性推送到日志吗

using(LogContext.PushProperty("EventId", _events.SendingEmailSmarEmailing.Id))
   _logger.LogInformation("Test polling service runned.");

我使用中间件自动推送属性。 这需要3个变化;LogEventEnricher,中间件,用于为每个请求推送属性,最后是需要注册的属性。 它通过中间件注入eventenricher来工作,它使用eventenricher在等待调用控制器端点处理程序的_next()之前推送属性

公共类CommonEventEnricher:ILogEventEnricher
{
private readonly YourOperationContext\u operationContext;
公共CommonEventEnricher(您的操作上下文)
{
_操作上下文=上下文;
}
public void explore(LogEvent LogEvent,ILogEventPropertyFactory propertyFactory)
{
logEvent.AddOrUpdateProperty(propertyFactory.CreateProperty(“EventId”,_operationContext.EventId));
}
}
公共类日志拦截器或中间件
{
private readonly RequestDelegate\u next;
公共日志拦截器或中间件(RequestDelegate下一步)
{
_下一个=下一个;
}
公共异步任务调用(HttpContext上下文,ILogEventEnricher logEventEnricher)
{
使用(LogContext.Push(logEventEnricher))
{
等待下一步(上下文);
}
}
}
最后:

applicationBuilder.useMidleware()
serviceCollection.addScope();

在您的启动中,我使用中间件自动推送属性。 这需要3个变化;LogEventEnricher,中间件,用于为每个请求推送属性,最后是需要注册的属性。 它通过中间件注入eventenricher来工作,它使用eventenricher在等待调用控制器端点处理程序的_next()之前推送属性

公共类CommonEventEnricher:ILogEventEnricher
{
private readonly YourOperationContext\u operationContext;
公共CommonEventEnricher(您的操作上下文)
{
_操作上下文=上下文;
}
public void explore(LogEvent LogEvent,ILogEventPropertyFactory propertyFactory)
{
logEvent.AddOrUpdateProperty(propertyFactory.CreateProperty(“EventId”,_operationContext.EventId));
}
}
公共类日志拦截器或中间件
{
private readonly RequestDelegate\u next;
公共日志拦截器或中间件(RequestDelegate下一步)
{
_下一个=下一个;
}
公共异步任务调用(HttpContext上下文,ILogEventEnricher logEventEnricher)
{
使用(LogContext.Push(logEventEnricher))
{
等待下一步(上下文);
}
}
}
最后:

applicationBuilder.useMidleware()
serviceCollection.addScope();

在你的初创公司中

它似乎在那里是的,但如何在ILogEventEnricher内部访问它?它似乎在那里是的,但如何在ILogEventEnricher内部访问它?这在asp.net之外会起作用吗?我想在其他类型的应用程序中记录事件,主要是worker服务。是的,在asp之外的方法仍然相同,尽管需要对拦截器(如aspnet中间件)的支持。同样,您当然也需要自己控制范围(对于IoC)。Aspnet core会自动为每个请求创建一个作用域,因此您可以执行非常类似的操作,并为您的工作人员执行的每个独立“操作”创建一个作用域,这些操作将在asp.net之外工作?我想在其他类型的应用程序中记录事件,主要是worker服务。是的,在asp之外的方法仍然相同,尽管需要对拦截器(如aspnet中间件)的支持。同样,您当然也需要自己控制范围(对于IoC)。Aspnet core会自动为每个请求创建一个范围,因此您可以执行非常类似的操作,并为工作人员执行的每个独立“操作”创建一个范围