Как добавить некоторое значение для запроса (OWIN) в контекст log4net? - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь создать промежуточное программное обеспечение OWIN (IIS Hosted), которое будет гарантировать, что все события 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";
    }
}

Использовать 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);
}
...