#.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.RunB
, я хочу, чтобы B содержал информацию A. Я спрашивал о запросе C. Увидит ли он значение A ?4. Нет, если вы сделаете два вызова, например, в конечную точку REST, то каждый поток будет иметь свое собственное значение.