我尝试创建OWIN(IIS托管)中间件,该中间件将确保所有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);
}