如何禁用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
相关产品推荐
相关产品推荐

