【问题标题】:.Net Framework 4.8 MVC - ${aspnet-TraceIdentifier} is always empty.Net Framework 4.8 MVC - ${aspnet-TraceIdentifier} 始终为空
【发布时间】:2021-04-03 04:56:18
【问题描述】:

在我的 .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 会自动检测扩展。”

所以,在我的控制器中,我只是获取当前类记录器和日志记录:

NLog.LogManager.GetCurrentClassLogger().Info("Hello World");

但不幸的是,${aspnet-TraceIdentifier} 的值是空的,最糟糕的是我找不到任何关于如何使它工作的文档。

我尝试在 NLog.config 文件中的目标上方放置扩展标签

<extensions>
    <add assembly="NLog.Web"/>
</extensions>

甚至也尝试过:

<extensions>
    <add assembly="NLog.Web.AspNetCore"/>
</extensions>

但没有任何改变。任何人都可以帮忙吗?有什么我想念的吗?毕竟可能是配置问题?

【问题讨论】:

标签: c# asp.net-mvc logging nlog


【解决方案1】:

不清楚您使用的是 ASP.NET 还是 ASP.NET Core。

所以对两者都有一个答案:

ASP.NET(非核心)

对于 ASP.NET,您应该使用 &lt;add assembly="NLog.Web"/&gt; 和 NLog.Web 包

将在内部使用HttpWorkerRequest.RequestTraceIdentifier

ASP.NET 核心

对于 ASP.NET Core,您应该使用 &lt;add assembly="NLog.Web.AspNetCore"/&gt; 和 NLog.Web.AspNetCore 包

NLog 使用这些作为跟踪标识符:

  • ASP.NET Core 3-5:使用System.Diagnostics.Activity.Current.Id(默认)或HttpContext.TraceIdentifier

  • ASP.NET Core 1+2:HttpContext.TraceIdentifier

  • 对于 ASP.NET Core 3-5,您可能需要 ignoreActivityId。例如${aspnet-TraceIdentifier:ignoreActivityId=true} - 如果为真 - 将使用 HttpContext.TraceIdentifier 而不是 System.Diagnostics.Activity.Current.Id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-09
    • 2021-12-23
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 2020-02-28
    相关资源
    最近更新 更多