Сохраняет ли Asp.Net Core CallContext между запросами? - PullRequest
2 голосов
/ 14 мая 2019

Сохраняет ли Asp.Net Core CallContext между запросами?

У нас есть сценарий использования для присоединения контекстных свойств (имени пользователя) к потоку, которые можно извлечь из нашей среды ведения журналов (NLog, MDLC ). Насколько я могу судить, MDLC использует CallContext.

Нам нужно, чтобы каждый запрос имел чистые контекстные свойства. Нужно ли очищать CallContext в начале?

Ответы [ 2 ]

1 голос
/ 15 мая 2019

NLog.Web.AspNetCore предоставляет множество средств визуализации макета, которые могут захватывать свойства контекста HttpRequest для ведения журнала (без необходимости внедрения в NLog MDLC).

Это будет проверять HttpRequest-Header для значения JSNLog-RequestId, и если пустое резервное копирование к AspNetCore-RequestId, и если также пусто, то возврат к AspNetCore-TraceIdentifer

${aspnet-request:header=JSNLog-RequestId:whenEmpty=${mdlc:item=RequestId:whenEmpty=${aspnet-traceIdentifier}}}

Список доступных $ {aspnet} макетов-визуализаторов

NLog использует AsyncLocal в NetCore, и если вы используете протокол расширений Microsoft (MEL), то вы можете использовать ILogger.BeginScope для добавления свойств в NLog MDLC (и очищается при выходе из области видимости)

NLog MDLC также можно заполнить с помощью MappedDiagnosticsLogicalContext.SetScoped , который также будет очищен при выходе из области применения.

0 голосов
/ 14 мая 2019

Мы используем Serilog (должен быть более или менее эквивалентен NLog).Он имеет очень хорошую интеграцию с ILogger из ядра Aspnet.

Вы можете создать промежуточное ПО и использовать 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-вызова (с разными потоками).

Ваша интеграция с NLog должна быть аналогичной после этой вики https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2

...