对于使用 HttpClient 的 API 调用,无法使用 NLog 抑制 Microsoft 日志

Unable to suppress Microsoft logs with NLog for API calls using HttpClient

我已经为 .NET Core 3.1 MVC 网络应用程序和 API 项目实施了 NLog。两者的 nlog.config 文件几乎相同。我已经仔细检查过了,唯一的区别是他们登录的数据库 table 名称和文件名。

我成功地从 API 项目中抑制了非必要的 Microsoft 日志,但我只能部分地对 Web 应用程序执行此操作。具体来说,Microsoft 的 Trace 和 Info 日志处理使用 HttpClient 调用 API 出现在文件和数据库中: 可以看到只有一条日志是我实际写的日志,其他的都是微软自动记录的。

我不确定在这里尝试什么,但我查看了内部日志,没有发现任何异常。

我想知道如何禁止额外的 Microsoft 日志以及我当前的配置有什么问题?

我安装的 NuGet 包(两个应用程序相同):

Web 应用程序项目的

nlog.config:

<?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"
      throwConfigExceptions="true"
      internalLogLevel="Info"
      internalLogFile="c:\temp\internal-CNC_WebUI-nlog.txt">

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

  <targets>
    <target xsi:type="File" name="CNC_WebUIFile" fileName="c:\temp\nlog-CNC_WebUIFile-${shortdate}.log"
            layout="${aspnet-traceidentifier}|${configsetting:AppSettings.NlogConnection.AppName}|${event-properties:ObjectID}|${date}|${uppercase:${level}}|${message} ${exception:format=tostring}|${logger}|${callsite:filename=false}|${exception:toString}" />

    <target name="databaseLogger" xsi:type="Database"
          dbProvider="sqlserver"
          dbHost="${configsetting:AppSettings.NlogConnection.DbHost}"
          dbDatabase="${configsetting:AppSettings.NlogConnection.Database}"
          dbUserName="${configsetting:AppSettings.NlogConnection.User}"
          dbPassword="${configsetting:AppSettings.NlogConnection.Password}" >

      <commandText>
        INSERT INTO dbo.CNC_WebUILogs (
        CorrelationId, Application, ObjectID, Logged, Level, Message,
        Logger, CallSite, Exception
        ) VALUES (
        @CorrelationId, @Application, @ObjectID, @Logged, @Level, @Message,
        @Logger, @Callsite, @Exception
        );
      </commandText>
      <parameter name="@correlationId" layout="${aspnet-traceidentifier}" />
      <parameter name="@application" layout="${configsetting:AppSettings.NlogConnection.AppName}" />
      <parameter name="@ObjectID" layout="${event-properties:ObjectID}" />
      <parameter name="@logged" layout="${date}" />
      <parameter name="@level" layout="${level}" />
      <parameter name="@message" layout="${message}" />
      <parameter name="@logger" layout="${logger}" />
      <parameter name="@callSite" layout="${callsite:filename=false}" />
      <parameter name="@exception" layout="${exception:toString}" />
    </target>
  </targets>

  <rules>
    <logger name="Microsoft.*" levels="Warn,Error,Fatal" writeTo="databaseLogger,CNC_WebUIFile"></logger>
    <logger name="Microsoft.*" minlevel="Trace" final="true" />

    <logger name="*" minlevel="Trace" writeTo="CNC_WebUIFile" />
    <logger name="*" minlevel="${configsetting:AppSettings.NlogConnection.LogLevel}" writeTo="databaseLogger" />
  </rules>
</nlog>

我的一个回购协议的 API 调用 activity 被微软记录:

public class MfgrRepo : IMfgrRepo
{
    private readonly IHttpClientFactory _clientFactory;

    public MfgrRepo(IHttpClientFactory clientFactory)
    {
        _clientFactory = clientFactory;
    }

    public async Task<List<MfgrDto>> Get()
    {
        HttpClient client = _clientFactory.CreateClient(HttpClientConfigNames.CNC);

        List<MfgrDto> models = new List<MfgrDto>();
        try
        {
            HttpResponseMessage response = await client.GetAsync("api/Mfgrs");
            models.AddRange(await response.Content.ReadFromJsonAsync<List<MfgrDto>>());
        }
        catch (Exception ex)
        {
            throw ex;
        }

        return models;
    }
}

您可以通过appsettings.json文件M.E.Logging系统使用的configure the log levels。这也允许您配置每个命名空间的类型,这样您就可以使 System.Net.Http 命名空间保持静默:

{
  "Logging": {
    "LogLevel": {
      "System.Net.Http": "Warning"
    }
  }
}

你这里已经有一个黑洞了:

  <rules>
    <logger name="Microsoft.*" levels="Warn,Error,Fatal" writeTo="databaseLogger,CNC_WebUIFile"></logger>
    <logger name="Microsoft.*" minlevel="Trace" final="true" /> <!-- Black Hole -->

    <logger name="*" minlevel="Trace" writeTo="CNC_WebUIFile" />
    <logger name="*" minlevel="${configsetting:AppSettings.NlogConnection.LogLevel}" writeTo="databaseLogger" />
  </rules>

我会像这样配置一个额外的“黑洞”:

  <rules>
    <logger name="Microsoft.*" maxLevel="Info" final="true" /> <!-- Black Hole 1 -->
    <logger name="System.Net.Http.*" maxLevel="Info" final="true" /> <!-- Black Hole 2 -->

    <logger name="*" minlevel="Trace" writeTo="CNC_WebUIFile" />
    <logger name="*" minlevel="${configsetting:AppSettings.NlogConnection.LogLevel}" writeTo="databaseLogger" />
  </rules>