Я пытаюсь создать промежуточное программное обеспечение OWIN (IIS Hosted), которое будет гарантировать, что все события log4net будут иметь определенное свойство (CorrelationId
), назначенное для запроса.
Я пытался:
- Используйте следующее промежуточное ПО и используйте
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);
}