You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用ASP.NET Core应用默认日志?配置NLog仍有输出

问题描述

尝试禁用ASP.NET Core应用的默认日志,当前使用NLog并配置了nlog.config文件,同时在appsettings.json中添加了Logging配置节点,但仍会生成默认日志。已尝试添加Microsoft.AspNetCore.Routing和Microsoft.AspNetCore.Hosting命名空间的日志过滤,但无效果,希望了解如何禁用这些默认日志或排查配置遗漏点。

相关配置

1. appsettings.json中的Logging配置

"Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "None",
      "Microsoft.Hosting.Lifetime": "None",
      "Microsoft.AspNetCore.Hosting.Diagnostics": "None"
    },
    "EventLog": {
      "LogLevel": {
        "Microsoft.AspNetCore.Hosting.Diagnostics": "None"
      }
    }
}

2. Program.cs初始化代码

var logger = LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();

var builder = WebApplication.CreateBuilder(args);

builder.Logging.ClearProviders();
builder.Host.UseNLog();

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"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
    <targets>
<!-- some targets here that I remove to make the code shorter-->
    </targets>

    <rules>
        <logger name="*" minlevel="Info" writeTo="Console"/>
        <logger name="*" minlevel="Info" writeTo="Logfile"/>
        <logger name="*" levels="Info"  writeTo="dbLogs"/>
    </rules>
</nlog>

4. 项目csproj文件

<Project Sdk="Microsoft.NET.Sdk.Web">

    <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
        <AssemblyVersion>0.0.5.0</AssemblyVersion>
        <FileVersion>0.0.5.0</FileVersion>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Asp.Versioning.Http" Version="8.1.0" />
        <PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.1.0" />
        <PackageReference Include="Azure.Storage.Blobs" Version="12.22.1" />
        <PackageReference Include="Dapper" Version="2.1.35" />
        <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.4"/>
        <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
        <PackageReference Include="NLog" Version="5.3.4" />
        <PackageReference Include="NLog.Database" Version="5.3.4" />
        <PackageReference Include="NLog.Extensions.Logging" Version="5.3.14" />
        <PackageReference Include="NLog.Web.AspNetCore" Version="5.3.14" />
        <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0"/>
        <PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
        <PackageReference Include="System.Drawing.Common" Version="9.0.0-rc.2.24474.1" />
        <PackageReference Include="System.Text.Json" Version="9.0.0-rc.2.24473.5" />
    </ItemGroup>

</Project>
解决方案

1. 调整NLog规则,排除Microsoft类日志

当前NLog规则中name="*"会匹配所有日志,包括Microsoft的系统日志。需要在规则开头添加排除规则,确保匹配到Microsoft命名空间的日志后直接忽略:

修改nlog.config的<rules>节点:

<rules>
    <!-- 排除所有Microsoft开头的日志,final=true表示不再执行后续规则 -->
    <logger name="Microsoft.*" minlevel="Trace" final="true" />
    <!-- 原有业务日志规则 -->
    <logger name="*" minlevel="Info" writeTo="Console"/>
    <logger name="*" minlevel="Info" writeTo="Logfile"/>
    <logger name="*" levels="Info"  writeTo="dbLogs"/>
</rules>

2. 确保Program.cs的配置顺序和逻辑正确

builder.Logging.ClearProviders()需要在builder.Host.UseNLog()之前执行,同时可以在创建builder时直接禁用默认日志加载逻辑,避免后续被默认配置覆盖:

修改Program.cs:

var logger = LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();

// 创建builder时直接清理默认日志提供程序
var builder = WebApplication.CreateBuilder(args);
builder.Logging.ClearProviders();
// 仅启用NLog作为日志提供程序
builder.Host.UseNLog();

或者更彻底的方式,在创建builder时就指定不加载默认日志配置:

var logger = LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();

var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
    Args = args,
    ConfigureLogging = b => b.ClearProviders()
});
builder.Host.UseNLog();

3. 排查第三方组件日志

部分第三方组件可能会绕过ASP.NET Core日志框架直接输出日志,这种情况需要查看组件的官方文档,配置其内部日志级别来禁用无关日志。

4. 启用NLog内部日志排查问题

将nlog.config中的internalLogLevel改为Debug,运行应用后查看c:\temp\nlog-internal.log,可以看到NLog处理日志的详细过程,确认排除规则是否生效,是否有未被匹配的日志来源。


内容的提问来源于stack exchange,提问作者Jonathan Gómez Pérez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 17:54:58