微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对于使用 HttpClient

如何解决对于使用 HttpClient

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

我成功地从 API 项目中抑制了非必要的 Microsoft 日志,但对于 Web 应用程序只能部分执行此操作。具体来说,Microsoft 处理使用 HttpClient 调用 API 的 Trace 和 Info 日志出现在文件数据库中:

photo of database table data showing microsoft logs that should not be there

可以看到只有一个是我实际写的日志,其余都是微软自动记录的。

我不知道该尝试什么,但我查看了内部日志并没有发现任何异常。

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

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

Picture showing NuGet packages and their versions I have installed: NLog-4.7.6,NLog.Extensions.Logging-1.6.5,NLog.Schema-4.7.6,NLog.Web.AspNetCore-4.9.3

网络应用项目的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 调用活动由 Microsoft 记录:

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 文件 configure the log levels M.E.Logging 系统使用。这还允许您配置每个命名空间的类型,因此您可以通过这种方式使 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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。