.Net Framework 4.8 MVC - ${aspnet-TraceIdentifier} 始终为空
.Net Framework 4.8 MVC - ${aspnet-TraceIdentifier} is always empty
在我的 .Net 4.8 MVC 应用程序中,我正在尝试使用 NLog 编写日志。其中一个字段是 traceId - ${aspnet-TraceIdentifier},它应该被 NLog.Web.
支持
所以我按照 documentation 安装了:
- NLog v4.7.6
- NLog.Extensions.Logging v1.6.5
- NLog.Web v4.9.3
我将 NLog.config 放在项目目录中:
<?xml version="1.0" ?>
<nlog autoReload="true"
xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
throwExceptions="true"
internalLogLevel="trace"
internalLogFile="c:\test\internal-nlog.txt">
<targets>
<target name="ws" xsi:type="WebService" protocol="JsonPost"
url="https://log-api.com/log/v1">
<parameter name="time" layout="${date}" />
<parameter name="level" layout="${level:upperCase=true}"/>
<parameter name="message" layout="${message}" />
<parameter name="host" layout="${machinename}" />
<parameter name="threadid" layout="${threadid}" />
<parameter name="ActivityId" layout="${activityId}" />
<parameter name="processId" layout="${processId}" />
<parameter name="threadid" layout="${threadid}" />
<parameter name="event-properties" layout="${all-event-properties}" />
<parameter name="exception" layout="${exception}" />
<parameter name="traceId" layout="${aspnet-TraceIdentifier}" />
<parameter name="environment" layout="Production" />
<parameter name="serviceName" layout="company-api2222222" />
<parameter name="session" layout="${aspnet-session}"/>
<parameter name="sessionId" layout="${aspnet-sessionid}"/>
<header name="X-License-Key" layout="${environment:LICENSE_KEY}"/>
</target>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="ws" />
</rules>
</nlog>
根据文档,不需要进一步配置:
"只需安装包。NLog 会自动检测扩展。"
所以,在我的控制器中,我只是获取当前的 class 记录器和日志记录:
NLog.LogManager.GetCurrentClassLogger().Info("Hello World");
但不幸的是,${aspnet-TraceIdentifier} 值是空的,最糟糕的是我找不到任何关于如何让它工作的文档。
我试图将扩展标签放在 NLog.config 文件中的目标上方
<extensions>
<add assembly="NLog.Web"/>
</extensions>
甚至还尝试了这个:
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
但没有任何改变。谁能帮忙?有什么我想念的吗?也许毕竟是配置问题?
不清楚您使用的是 ASP.NET 还是 ASP.NET Core。
所以两者的答案:
ASP.NET(非核心)
对于 ASP.NET 你应该使用 <add assembly="NLog.Web"/>
和 NLog.Web 包
- 对于 ASP.NET IIS 需要启用 IIS ETW 功能:https://docs.microsoft.com/en-us/iis/configuration/system.webServer/httpTracing/ (IIS7 - Win2008)
内部 HttpWorkerRequest.RequestTraceIdentifier
将被使用。
ASP.NET核心
对于ASP.NET核心你应该使用<add assembly="NLog.Web.AspNetCore"/>
和NLog.Web.AspNetCore包
NLog 使用这些作为跟踪标识符:
ASP.NET 核心 3-5:使用 System.Diagnostics.Activity.Current.Id
(默认)或 HttpContext.TraceIdentifier
ASP.NET核心1+2:HttpContext.TraceIdentifier
对于 ASP.NET 核心 3-5,您可能需要 ignoreActivityId。例如${aspnet-TraceIdentifier:ignoreActivityId=true}
- 如果为真 - HttpContext.TraceIdentifier
将被用来代替 System.Diagnostics.Activity.Current.Id
在我的 .Net 4.8 MVC 应用程序中,我正在尝试使用 NLog 编写日志。其中一个字段是 traceId - ${aspnet-TraceIdentifier},它应该被 NLog.Web.
支持所以我按照 documentation 安装了:
- NLog v4.7.6
- NLog.Extensions.Logging v1.6.5
- NLog.Web v4.9.3
我将 NLog.config 放在项目目录中:
<?xml version="1.0" ?>
<nlog autoReload="true"
xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
throwExceptions="true"
internalLogLevel="trace"
internalLogFile="c:\test\internal-nlog.txt">
<targets>
<target name="ws" xsi:type="WebService" protocol="JsonPost"
url="https://log-api.com/log/v1">
<parameter name="time" layout="${date}" />
<parameter name="level" layout="${level:upperCase=true}"/>
<parameter name="message" layout="${message}" />
<parameter name="host" layout="${machinename}" />
<parameter name="threadid" layout="${threadid}" />
<parameter name="ActivityId" layout="${activityId}" />
<parameter name="processId" layout="${processId}" />
<parameter name="threadid" layout="${threadid}" />
<parameter name="event-properties" layout="${all-event-properties}" />
<parameter name="exception" layout="${exception}" />
<parameter name="traceId" layout="${aspnet-TraceIdentifier}" />
<parameter name="environment" layout="Production" />
<parameter name="serviceName" layout="company-api2222222" />
<parameter name="session" layout="${aspnet-session}"/>
<parameter name="sessionId" layout="${aspnet-sessionid}"/>
<header name="X-License-Key" layout="${environment:LICENSE_KEY}"/>
</target>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="ws" />
</rules>
</nlog>
根据文档,不需要进一步配置: "只需安装包。NLog 会自动检测扩展。"
所以,在我的控制器中,我只是获取当前的 class 记录器和日志记录:
NLog.LogManager.GetCurrentClassLogger().Info("Hello World");
但不幸的是,${aspnet-TraceIdentifier} 值是空的,最糟糕的是我找不到任何关于如何让它工作的文档。
我试图将扩展标签放在 NLog.config 文件中的目标上方
<extensions>
<add assembly="NLog.Web"/>
</extensions>
甚至还尝试了这个:
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
但没有任何改变。谁能帮忙?有什么我想念的吗?也许毕竟是配置问题?
不清楚您使用的是 ASP.NET 还是 ASP.NET Core。
所以两者的答案:
ASP.NET(非核心)
对于 ASP.NET 你应该使用 <add assembly="NLog.Web"/>
和 NLog.Web 包
- 对于 ASP.NET IIS 需要启用 IIS ETW 功能:https://docs.microsoft.com/en-us/iis/configuration/system.webServer/httpTracing/ (IIS7 - Win2008)
内部 HttpWorkerRequest.RequestTraceIdentifier
将被使用。
ASP.NET核心
对于ASP.NET核心你应该使用<add assembly="NLog.Web.AspNetCore"/>
和NLog.Web.AspNetCore包
NLog 使用这些作为跟踪标识符:
ASP.NET 核心 3-5:使用
System.Diagnostics.Activity.Current.Id
(默认)或HttpContext.TraceIdentifier
ASP.NET核心1+2:
HttpContext.TraceIdentifier
对于 ASP.NET 核心 3-5,您可能需要 ignoreActivityId。例如
${aspnet-TraceIdentifier:ignoreActivityId=true}
- 如果为真 -HttpContext.TraceIdentifier
将被用来代替System.Diagnostics.Activity.Current.Id