NLog не выводит значение из заголовка запроса pnet - PullRequest
0 голосов
/ 27 мая 2020

У меня возникли проблемы с тем, чтобы NLog распечатал значение из указанного c заголовка запроса - заголовок x-correlation-id назначается в начале запроса. На самом деле я вообще не могу заставить NLog печатать какие-либо заголовки.

В моем nlog.config у меня есть следующий макет и цель. Guid, содержащийся в заголовке x-correlation-id, должен быть напечатан сразу после уровня журнала.

<variable name="layout" value="${longdate} | ${level:uppercase=true} | ${aspnet-request-headers:HeaderNames=x-correlation-id:ValuesOnly=true} | ${logger}.${aspnet-mvc-action}() | Msg: ${message}${when:when=length('${exception}')>0:Inner= | }${exception:format=tostring}" />
<targets>
  <target name="logfile" 
          xsi:type="File"
          fileName="${logDirectory}\${shortdate}_logfile.txt"
          layout="${layout}"/>
</targets>

Пример вывода из файла журнала:

2020-05-27 16:29:07.1991 | INFO |  | KrFo.KlientServices.Skelet.Logic.HelloWorldService.GetHelloWorld() | Msg: Hello from controller.

Любая помощь приветствуется.


Edit 1: Я изучил эту проблему подробнее. И, как упоминает @RolfKristensen, я включил внутренний журнал NLog. Я вижу эту строку c там:

2020-05-28 22:43:42.4260 Debug Missing serviceProvider, so no HttpContext

Насколько я понимаю, этот поставщик услуг передает HttpContext в NLog, поэтому, конечно, он ничего не печатает из HttpContext . Я просто не могу найти никакого решения для этого. Google не особо помогает мне в этом.


Изменить 2 : Хорошо. Очевидно, это происходит из-за того, что заголовок x-correlation-id применяется к запросу относительно того, когда я пытаюсь получить доступ к заголовку в моем макете NLog. Не знаю, как это работает и почему, но это единственное объяснение, которое я вижу. Я обнаружил, что могу распечатать все текущие заголовки запросов, вызвав ${aspnet-request-headers} в моем макете NLog. Но все равно не удалось распечатать заголовок x-correlation-id (потому что он еще не был применен).

К счастью, я нашел отличную работу при инициализации службы CorrelationId. Добавив CorrelationId в область ведения журнала в ConfigureServices() из Startup.cs, например,

services.AddDefaultCorrelationId(options => options.AddToLoggingScope = true);

, я могу получить CorrelationId из области ведения журнала и распечатать его в моем макете, вызвав имя элемента " CorrelationId "(по умолчанию) в NLog Mapped Diagnosti c Logical Context (MDL C) like ${mdlc:CorrelationId}

Это не отвечает на мой исходный вопрос. Но это дало мне работу, и теперь я могу выводить CorrelationId в свой файл журнала по каждому запросу.

2020-05-29 17:24:26.2250 | INFO | 6d7d8d8a-eca4-4af5-81d4-beb11d7f2766 | KrFo.KlientServices.Skelet.Logic.HelloWorldService.GetHelloWorld() | Message: Getting list of HelloWorlds
...