我在让 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
据我了解,该服务提供商正在HttpContext
将HttpContext
. 我似乎无法找到任何解决方案。谷歌在这方面对我帮助不大。
编辑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