如何在log4net上下文中添加每个请求(OWIN)值?

时间:2018-12-14 08:24:28

标签: owin log4net

我尝试创建OWIN(IIS托管)中间件,该中间件将确保所有log4net事件将具有根据请求分配的特定属性(CorrelationId)。

我试图:

  1. 使用以下中间件并使用IOwinContext

它仅在追加器批处理大小为1时有效。否则,将为整个事件分配相同的CorrelationId

public class CorrelationIdMiddleware : OwinMiddleware
{
    public CorrelationIdMiddleware(OwinMiddleware next): base(next){}

    public override async Task Invoke(IOwinContext context)
    {            
        correlationId = Guid.NewGuid().ToString();
        context.Set("CorrelationId", correlationId);
        await Next.Invoke(context);
    }
}

中间件与log4net活动属性配对:

public class CorrelationIdActiveLog4NetValue
{
    public override string ToString()
    {
        var context = HttpContext.Current.GetOwinContext();
        if (context != null)
        {
            var value = context.Get<string>("CorrelationId");
            if (!string.IsNullOrEmpty(value))
            {
                return value;
            }
        }

        return "N/A";
    }
}
  1. 使用LogicalCallContext。

    var stack = log4net.LogicalThreadContext.Stacks["CorrelationId"] using (stack.Push(correlationId)) { log4net.LogManager.GetLogger(typeof(CorrelationIdMiddleware)) .Info("TEST MESSAGE"); await Next.Invoke(context); }

它适用于我在中间件本身中生成的消息,但不适用于我从控制器登录的消息。

为了进行比较,在Serilog中,这种中间件代码在每种情况下(ASP.NET核心)都可以通用:

using (LogContext.PushProperty("BayCorrelationId", context.TraceIdentifier))
{
    await next(context);
}

0 个答案:

没有答案