无法减少 NLog 中特定记录器的详细程度

Jam*_*ill 1 nlog asp.net-core

几天前,我在 ASP.Net / .Net 6 环境中从 NLog 4 升级到 NLog v5。当我更新时,我注意到我从比过去更多的记录器中获取了详细信息(我仍然不明白为什么)。

为了减少干扰,我开始在 NLog.config 中创建规则来消除噪音。我使用了 NLog 文档以及这个 SO 问题作为我的指南:NLog禁用特定记录器 - for real

不幸的是,这些规则似乎被忽视了。我仍然收到大量信息级别的Microsoft.AspNetCore.*日志记录Microsoft.EntityFrameworkCore.*

我在这里缺少一些简单的东西吗?

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="Info"
      internalLogFile="c:\temp\internal-nlog.txt">

  <!-- Ensure all times are logged in UTC -->
  <time type="AccurateUTC" />

  <!-- enable asp.net core layout renderers -->
  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
    <add assembly="NLog.Database"/>
  </extensions>

  <!-- the targets to write to -->
  <targets>
    <target name="db"
            xsi:type="Database"
            commandType="StoredProcedure"
            commandText="[dbo].[NLog_AddEntry_p]"
            connectionString="${configsetting:item=ConnectionStrings.DefaultConnection}">
      <parameter name="@errorId" layout="${mdlc:item=errorId}" />
      <parameter name="@ipAddress" layout="${aspnet-request-ip}" />
      <parameter name="@machineName" layout="${machinename}" />
      <parameter name="@siteName" layout="${iis-site-name}" />
      <parameter name="@logged" layout="${date}" />
      <parameter name="@level" layout="${level}" />
      <parameter name="@username" layout="${aspnet-user-identity}" />
      <parameter name="@message" layout="${message}" />
      <parameter name="@logger" layout="${logger}" />
      <parameter name="@properties" layout="${all-event-properties:separator=|}" />
      <parameter name="@serverName" layout="${aspnet-Request-Host}" />
      <parameter name="@serverAddress" layout="${aspnet-request-url}" />
      <parameter name="@callSite" layout="${callsite}" />

      <parameter name="@requestMethod" layout="${aspnet-request-method}" />
      <parameter name="@payload" layout="${aspnet-request-posted-body}" />
      <parameter name="@queryString" layout="${aspnet-request-querystring}" />
      <parameter name="@referrer" layout="${aspnet-request-referrer}" />
      <parameter name="@userAgent" layout="${aspnet-request-useragent}" />
        
      <!--<parameter name="@exception" layout="${exception:tostring}:${stacktrace:format=Enum:topFrames=Integer:skipFrames=Integer:separator=String}" />-->
      <parameter name="@exception" layout="${exception:format=ToString,StackTrace:format=ToString}${newline}" />
    </target>
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
      <!--Disable logging of specific overly talkative loggers-->
      <logger name="Microsoft.AspNetCore.*" minlevel="Warning" final="true" />
      <logger name="Microsoft.EntityFrameworkCore.*" minlevel="Warning" final="true" />
      <!--END Disable logging of specific overly talkative loggers-->

      <logger name="*" minlevel="Info" writeTo="db" />
      <logger name="*" minLevel="Fatal" writeTo="mail" />
  </rules>
</nlog>
Run Code Online (Sandbox Code Playgroud)

Rol*_*sen 6

NLog 5.0 中没有任何过滤器,您会受到 NLog.Extensions.Logging 这一重大更改的影响。

推荐的解决方案是更新 NLog.config 以执行过滤。可以使用以下方法完成maxLevel=""

  <!-- rules to map from logger name to target -->
  <rules>
      <logger name="Microsoft.Hosting.Lifetime" minLevel="Info" writeTo="db" />
      <!--Disable logging of specific overly talkative loggers-->
      <logger name="Microsoft*" maxlevel="Info" final="true" />
      <!--END Disable logging of specific overly talkative loggers-->

      <logger name="*" minlevel="Info" writeTo="db" />
      <logger name="*" minLevel="Fatal" writeTo="mail" />
  </rules>
Run Code Online (Sandbox Code Playgroud)

NLog 5.0还引入了对finalMinLevel的支持:

  <!-- rules to map from logger name to target -->
  <rules>
      <!--Disable logging of specific overly talkative loggers-->
      <logger name="Microsoft*" finalMinLevel="Warn" />
      <logger name="Microsoft.Hosting.Lifetime" finalMinLevel="Info" />
      <!--END Disable logging of specific overly talkative loggers-->

      <logger name="*" minlevel="Info" writeTo="db" />
      <logger name="*" minLevel="Fatal" writeTo="mail" />
  </rules>
Run Code Online (Sandbox Code Playgroud)

注意finalMinLevel=""与 Microsoft 日志过滤器配置类似,其中更容易覆盖默认过滤器,例如 for "Microsoft.Hosting.Lifetime".