在.NET Core MVC Web应用程序中,我已将Serilog集成为日志记录系统。在自定义接收器中,我将每个级别记录到API。在这里,我需要一些属性,例如用户名。因为这些属性并非始终可用。因此,当视图打开时,会发生很多信息,并且在少数日志事件中,属性是可用的,但是在每个日志事件中我都需要它们。
我正在推送AsyncActionFilter中的属性,该属性已添加到MvcOptions中。还尝试将其设置为HomeController上的属性。在生命周期中,它们已从LogContext中弹出。我还使用LogContextMiddleware推送了一些属性,但是如前所述,我无法在此位置放置一些属性。
Serilog配置
Log.Logger = new LoggerConfiguration()
.WriteTo.PasSink(new SerLogServiceClient.SerLogServiceClient(new SerLogServiceClientOptions()))
.Enrich.FromLogContext()
.CreateLogger();
LogContextFilter
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2).AddMvcOptions(mo =>
{
mo.Filters.Add(typeof(LogContextFilter));
});
public class LogContextFilterAttribute : TypeFilterAttribute
{
/// <inheritdoc />
public LogContextFilterAttribute() : base(typeof(LogContextFilter))
{
}
}
public class LogContextFilter : IAsyncActionFilter
{
public LogContextFilter()
{
}
#region Implementation of IAsyncActionFilter
/// <inheritdoc />
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
LogContext.Push(
new PropertyEnricher("UserCode",
context.HttpContext.User.Claims.FirstOrDefault(s => s.ToString().StartsWith("UserCode"))?.Value),
new PropertyEnricher("Test", "Will this go through?"));
{
await next.Invoke();
}
}
#endregion
}
Serilog水槽
public void Emit(LogEvent logEvent)
{
var logMessage = logEvent.RenderMessage();
//Console.WriteLine("Testing from PasSink. Whoop whoop! " + logMessage);
try
{
if (logEvent.Level.ToString() == "Error")
{
var task = _serLogClient.Log.CreateLog(LogContent(logEvent.Properties.FirstOrDefault(p => p.Key == "UserCode").Value.AsString(),
logMessage, logEvent.Level.ToString(), logEvent.Properties.FirstOrDefault(p => p.Key == "TraceIdentifier").Value.AsString(), logEvent.Timestamp));
//httpClient.PutAsync(_pasUrl, BuildJsonContent(logEvent.Properties.FirstOrDefault(p => p.Key == "UserName").Value.ToString(),
// logEvent.Level.ToString()));
logContent.ttLog.Clear();
}
}
catch (Exception e)
{
//httpClient = new HttpClient();
logContent.ttLog.Clear();
}
}
因此,我希望所有日志事件都具有所有属性。因此,也许mvc过滤器不是将属性推送到上下文的正确位置。但是那是什么好的方法呢?