Используя aspnet-элемент NLog:переменная внутри задачи.Выполнить?

#.net-core #nlog

Вопрос:

Мой файл Nlog.config содержит этот шаблон :

  <target xsi:type="Console" name="Console"
            layout="${aspnet-item:variable:requestId} ${newline} ..." />
 

Я использую .net core (с докером).

В ожидаемом коде я вижу значение item:variable:requestId , потому что я использую :

  _httpContextAccessor.HttpContext.Items["requestId"] = "dummyvalue";
 

Таким образом, nlog может прочитать его из контекста.

Однако , если мой loggerService работает внутри a Task.Run , то я не вижу значений. ( потому что у Task.run нет HttpContext )

Вопрос:

Есть ли API кода, который я могу вручную задать aspnet-item:variable:requestId значение ? или есть другой вариант ?

Ответ №1:

В коде:

 MappedDiagnosticsLogicalContext.Set("MyValueName", myValue);
 

В файле Nlog.config:

 <target layout="${mdlc:item=MyValueName}" includeMdlc="true">
 

Комментарии:

1. если я помещу это в task.run , повлияет ли это на другой код, которого нет в task.run ?

2. Зависит. В общем случае это значение сохраняется для всего вызова и подходит, например, для идентификаторов корреляции запросов. С другой стороны, мы используем этот подход в фоновом задании, которое генерирует новый идентификатор для каждой задачи, и это работает. Так что для вашего случая, вероятно, не полное решение, но, возможно, оно продвинет вас дальше.

3. Я хочу, чтобы это было на весь звонок. поэтому , если основной поток A создаст Task.Run B , я хочу, чтобы B содержал информацию A. Я спрашивал о запросе C. Увидит ли он значение A ?

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