C# 无法使用NLog抑制使用HttpClient进行API调用的Microsoft日志

C# 无法使用NLog抑制使用HttpClient进行API调用的Microsoft日志,c#,asp.net-mvc,asp.net-core,logging,nlog,C#,Asp.net Mvc,Asp.net Core,Logging,Nlog,我已经为.NET Core 3.1 MVC web应用程序和API项目实现了NLog。两者的nlog.config文件几乎相同。我仔细检查了这一点,唯一的区别是它们登录到的数据库表名和文件名 我成功地从API项目中抑制了不必要的Microsoft日志,但我只能为web应用程序部分抑制这些日志。具体而言,Microsoft使用HttpClient调用API的跟踪和信息日志会显示在文件和数据库中: 您可以看到,只有一个日志是我实际编写的日志,其余的日志是由Microsoft自动记录的 我不确定在这里

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

我成功地从API项目中抑制了不必要的Microsoft日志,但我只能为web应用程序部分抑制这些日志。具体而言,Microsoft使用
HttpClient
调用API的跟踪和信息日志会显示在文件和数据库中: 您可以看到,只有一个日志是我实际编写的日志,其余的日志是由Microsoft自动记录的

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

我想知道如何抑制其他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>

插入dbo.CNC_webuilog(
CorrelationId、应用程序、对象ID、日志、级别、消息、,
记录器,调用站点,异常
)价值观(
@CorrelationId、@Application、@ObjectID、@Logged、@Level、@Message、,
@记录器,@Callsite,@Exception
);
Microsoft记录了我的一个回购协议的API调用活动:

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;
    }
}
公共类MfgrRepo:imfgrepo
{
私有只读IHttpClientFactory\u客户端工厂;
公共MfgrRepo(IHttpClientFactory客户端工厂)
{
_clientFactory=clientFactory;
}
公共异步任务Get()
{
HttpClient客户端=_clientFactory.CreateClient(HttpClientConfigNames.CNC);
列表模型=新列表();
尝试
{
HttpResponseMessage response=wait client.GetAsync(“api/Mfgrs”);
models.AddRange(wait response.Content.ReadFromJsonAsync());
}
捕获(例外情况除外)
{
掷骰子;
}
收益模型;
}
}
您可以通过
appsettings.json
文件查看M.E.Logging系统使用的文件。这还允许您配置每个命名空间的类型,因此可以通过这种方式使
System.Net.Http
命名空间保持静默:

{
“日志记录”:{
“日志级别”:{
System.Net.Http:“警告”
}
}
}
您可以通过
appsettings.json
文件查看M.E.Logging系统使用的文件。这还允许您配置每个命名空间的类型,因此可以通过这种方式使
System.Net.Http
命名空间保持静默:

{
“日志记录”:{
“日志级别”:{
System.Net.Http:“警告”
}
}
}

这里已经有一个黑洞了:

  <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>

这里已经有一个黑洞了:

  <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>


谢谢你,波克。我一定忘了它是每个名称空间的,在
appsettings.js
nlog.config
@Lukas中,您不需要同时配置这两个名称空间
NLog.config
足够了谢谢你,波克。我一定忘了它是每个名称空间的,在
appsettings.js
nlog.config
@Lukas中,您不需要同时配置这两个名称空间
NLog.config
足够了,谢谢。这是更有意义的现在,我有这套。但是,我不确定
maxLevel
的行为。我希望它用
maxLevel=“Info”
记录信息日志,但我可以说它排除信息并记录下面的所有内容吗?我必须把
maxLevel=“Warning”
放进去才能看到信息日志。在我上面的评论中,我的意思是
maxLevel=“Debug”
才能看到信息日志。不管怎么说,我已经明白了,这是有道理的。如果我把
maxLevel=“Info”
放在黑洞中,那么它将去掉那些包含信息的级别。再次感谢,谢谢。这是更有意义的现在,我有这套。但是,我不确定
maxLevel
的行为。我希望它用
maxLevel=“Info”
记录信息日志,但我可以说它排除信息并记录下面的所有内容吗?我必须把
maxLevel=“Warning”
放进去才能看到信息日志。在我上面的评论中,我的意思是
maxLevel=“Debug”
才能看到信息日志。不管怎么说,我已经明白了,这是有道理的。如果我把
maxLevel=“Info”
放在黑洞中,那么它将去掉那些包含信息的级别。再次感谢。