Asp.Net核心是否跨请求保留CallContext?
我们有一个将上下文属性(用户名)附加到线程的用例,它可以从我们的日志框架(NLog,MDLC)中提取出来。据我所知,MDLC使用CallContext
。
我们需要每个请求都有干净的上下文属性。我们需要在开始时清除CallContext吗?
发布于 2019-05-16 03:23:28
NLog.Web.AspNetCore提供了大量的布局渲染器,可以捕获用于日志记录的HttpRequest-context-properties (不需要注入NLog MDLC)。
这将探测HttpRequest-Header中的值JSNLog-RequestId
,如果为空,则回退到AspNetCore-RequestId值,如果也为空,则回退到AspNetCore-TraceIdentifer
${aspnet-request:header=JSNLog-RequestId:whenEmpty=${mdlc:item=RequestId:whenEmpty=${aspnet-traceIdentifier}}}
可用${aspnet} Layout-renderers列表
NLog在NetCore上使用AsyncLocal,如果使用的是微软扩展日志记录(MEL),则可以使用ILogger.BeginScope将属性注入NLog MDLC (并在离开作用域时清除)
也可以使用MappedDiagnosticsLogicalContext.SetScoped填充using MDLC,当离开NLog -scope时也会将其清除。
发布于 2019-05-15 03:38:57
我们使用Serilog (应该与NLog大致相同)。它与来自Aspnet核心的ILogger有很好的集成。
您可以创建中间件并使用ILogger.BeginScope
public class LoggerMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<LoggerMiddleware> _logger;
public LoggerMiddleware(RequestDelegate next, ILogger<LoggerMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task Invoke(HttpContext context)
{
var dictionary = new Dictionary<string, object>
{
{ "Username", context.User?.Identity?.Name; }
};
using (_logger.BeginScope(dictionary))
{
await _next(context);
}
}
}
通过我们的Serilog集成,我们能够在我们的日志模板中使用Username
,并且它在整个HTTP调用过程中被保留(使用不同的线程)。
按照这个维基https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2,你的NLog积分应该是类似的
https://stackoverflow.com/questions/56129880
复制相似问题