Serilog 的 enricher 不记录属性
Serilog's enricher does not log properties
我有 ASP.NET MVC 应用程序,我正在使用 Serilog 进行日志记录。我已经实现了 serilog 的 enricher 来为每个日志条目记录用户的用户名
public class HttpContextEnricher : ILogEventEnricher
{
LogEventProperty _cachedProperty;
public const string EnvironmentUserNamePropertyName = "MyUserName";
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
if (HttpContext.Current == null)
return;
if (HttpContext.Current.User == null)
return;
if (HttpContext.Current.User.Identity == null)
return;
_cachedProperty = _cachedProperty ?? propertyFactory.CreateProperty(EnvironmentUserNamePropertyName, HttpContext.Current.User.Identity.Name);
logEvent.AddPropertyIfAbsent(_cachedProperty);
}
}
扩展方法
public static class HttpContextLoggerConfigurationExtensions
{
public static LoggerConfiguration WithUserName(
this LoggerEnrichmentConfiguration enrichmentConfiguration)
{
if (enrichmentConfiguration == null) throw new ArgumentNullException(nameof(enrichmentConfiguration));
return enrichmentConfiguration.With<HttpContextEnricher>();
}
}
在应用程序启动时配置它
Log.Logger = new LoggerConfiguration()
.Enrich.WithUserName()
.ReadFrom.AppSettings()
.CreateLogger();
这是我的应用设置
<add key="serilog:minimum-level" value="Information" />
<add key="serilog:using:EventLog" value="Serilog.Sinks.EventLog" />
<add key="serilog:write-to:EventLog" />
<add key="serilog:write-to:EventLog.source" value="MySource" />
<add key="serilog:write-to:EventLog.manageEventSource" value="false" />
这就是我记录的方式
Log.Information("Some information messaage");
我正在使用 WindowsEvent Sink。当我执行应用程序时,我看到消息被记录在 windows 的事件源中,但是日志没有 MyUserName
属性.
我不确定我在这里遗漏了什么?
我必须在 outputTemplate 中显式设置 UserName,以便它可以写入接收器。
<add key="serilog:write-to:EventLog.outputTemplate" value="[{Level}]{NewLine}{Timestamp:MM/dd/yyyy HH:mm:ss tt}{NewLine}UserName:{MyUserName}{NewLine}Message:{Message}{NewLine}{Exception}" />
我有 ASP.NET MVC 应用程序,我正在使用 Serilog 进行日志记录。我已经实现了 serilog 的 enricher 来为每个日志条目记录用户的用户名
public class HttpContextEnricher : ILogEventEnricher
{
LogEventProperty _cachedProperty;
public const string EnvironmentUserNamePropertyName = "MyUserName";
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
if (HttpContext.Current == null)
return;
if (HttpContext.Current.User == null)
return;
if (HttpContext.Current.User.Identity == null)
return;
_cachedProperty = _cachedProperty ?? propertyFactory.CreateProperty(EnvironmentUserNamePropertyName, HttpContext.Current.User.Identity.Name);
logEvent.AddPropertyIfAbsent(_cachedProperty);
}
}
扩展方法
public static class HttpContextLoggerConfigurationExtensions
{
public static LoggerConfiguration WithUserName(
this LoggerEnrichmentConfiguration enrichmentConfiguration)
{
if (enrichmentConfiguration == null) throw new ArgumentNullException(nameof(enrichmentConfiguration));
return enrichmentConfiguration.With<HttpContextEnricher>();
}
}
在应用程序启动时配置它
Log.Logger = new LoggerConfiguration()
.Enrich.WithUserName()
.ReadFrom.AppSettings()
.CreateLogger();
这是我的应用设置
<add key="serilog:minimum-level" value="Information" />
<add key="serilog:using:EventLog" value="Serilog.Sinks.EventLog" />
<add key="serilog:write-to:EventLog" />
<add key="serilog:write-to:EventLog.source" value="MySource" />
<add key="serilog:write-to:EventLog.manageEventSource" value="false" />
这就是我记录的方式
Log.Information("Some information messaage");
我正在使用 WindowsEvent Sink。当我执行应用程序时,我看到消息被记录在 windows 的事件源中,但是日志没有 MyUserName
属性.
我不确定我在这里遗漏了什么?
我必须在 outputTemplate 中显式设置 UserName,以便它可以写入接收器。
<add key="serilog:write-to:EventLog.outputTemplate" value="[{Level}]{NewLine}{Timestamp:MM/dd/yyyy HH:mm:ss tt}{NewLine}UserName:{MyUserName}{NewLine}Message:{Message}{NewLine}{Exception}" />