为什么Serilog LogContext在生命周期中会丢失属性?

时间:2019-03-29 09:50:12

标签: c# logging asp.net-core-mvc serilog

在.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过滤器不是将属性推送到上下文的正确位置。但是那是什么好的方法呢?

0 个答案:

没有答案