首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于使用HttpClient的应用编程接口调用,无法使用NLog抑制Microsoft日志

对于使用HttpClient的应用编程接口调用,无法使用NLog抑制Microsoft日志
EN

Stack Overflow用户
提问于 2020-12-28 23:06:19
回答 2查看 252关注 0票数 3

我已经为.NET Core3.1MVCweb应用程序和应用编程接口项目实现了NLog。这两个文件的nlog.config文件几乎相同。我已经仔细检查过了,唯一的区别是它们所记录的数据库表名和文件名。

我成功地从API项目中抑制了非必要的Microsoft日志,但对于web应用程序,我只能部分做到这一点。具体地说,微软的跟踪和信息日志出现在文件和数据库中,这些日志处理使用HttpClient调用应用程序接口:

您可以看到,其中只有一个日志是我实际编写的日志,其余的都是由Microsoft自动记录的。

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

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

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

web应用项目的nlog.config:

代码语言:javascript
复制
<?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>

我的其中一个repos的API调用活动由Microsoft记录:

代码语言:javascript
复制
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;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-28 23:11:22

您可以通过appsettings.json文件对M.E.Logging系统使用的文件执行configure the log levels操作。这还允许您为每个名称空间配置类型,因此可以通过这种方式使System.Net.Http名称空间保持静默状态:

代码语言:javascript
复制
{
  "Logging": {
    "LogLevel": {
      "System.Net.Http": "Warning"
    }
  }
}
票数 3
EN

Stack Overflow用户

发布于 2020-12-28 23:36:57

这里已经有一个黑洞了:

代码语言:javascript
复制
  <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>

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

代码语言:javascript
复制
  <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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65479689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档