У меня возникли проблемы с тем, чтобы 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