0

我在让 NLog 打印来自特定请求标头的值时遇到了一些麻烦——在x-correlation-id请求开始时分配的标头。实际上我根本无法让 NLog 打印任何标题。

在我的nlog.config我有以下布局和目标。标题中包含的 guidx-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.

任何帮助表示赞赏。


编辑1: 我现在已经进一步研究了这个问题。正如@RolfKristensen 提到的,我已经打开了内部 NLog 日志。我在那里看到了这条特定的行:

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

据我了解,该服务提供商正在HttpContextHttpContext. 我似乎无法找到任何解决方案。谷歌在这方面对我帮助不大。


编辑2:好的。显然,这是由于x-correlation-id标头应用于请求的时间与我尝试访问 NLog 布局中的标头时有关。不知道这是如何工作的以及为什么,但这是我能看到的唯一解释。我发现我可以通过调用${aspnet-request-headers}我的 NLog 布局来打印所有当前的请求标头。但仍然无法打印x-correlation-id标题(因为它尚未应用)。

幸运的是,我在 CorrelationId 服务初始化中找到了一个很好的解决方法。通过将 CorrelationId 添加到类似的日志ConfigureServices()记录Startup.cs范围

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

我可以通过调用 NLog映射诊断逻辑上下文 (MDLC)上的项目名称“CorrelationId”(默认)从日志记录范围中获取 CorrelationId 并将其打印到我的布局中,例如${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
4

0 回答 0