首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Asp.Net核心是否跨请求保留CallContext?

Asp.Net核心是否跨请求保留CallContext?
EN

Stack Overflow用户
提问于 2019-05-14 19:56:02
回答 2查看 512关注 0票数 2

Asp.Net核心是否跨请求保留CallContext?

我们有一个将上下文属性(用户名)附加到线程的用例,它可以从我们的日志框架(NLog,MDLC)中提取出来。据我所知,MDLC使用CallContext

我们需要每个请求都有干净的上下文属性。我们需要在开始时清除CallContext吗?

EN

回答 2

Stack Overflow用户

发布于 2019-05-16 03:23:28

NLog.Web.AspNetCore提供了大量的布局渲染器,可以捕获用于日志记录的HttpRequest-context-properties (不需要注入NLog MDLC)。

这将探测HttpRequest-Header中的值JSNLog-RequestId,如果为空,则回退到AspNetCore-RequestId值,如果也为空,则回退到AspNetCore-TraceIdentifer

代码语言:javascript
复制
${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时也会将其清除。

票数 1
EN

Stack Overflow用户

发布于 2019-05-15 03:38:57

我们使用Serilog (应该与NLog大致相同)。它与来自Aspnet核心的ILogger有很好的集成。

您可以创建中间件并使用ILogger.BeginScope

代码语言:javascript
复制
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积分应该是类似的

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56129880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档