能否在同一个.NET Web应用中同时使用Serilog和NLog日志组件
.NET Web应用同时集成Serilog和NLog的解决方案
可以在同一个.NET Web应用中同时使用Serilog和NLog,你遇到的NLog生成空文件的问题是配置注册逻辑导致的,并非组件不兼容。
- 核心原因:.NET 内置的
ILogger日志抽象默认只会将日志输出到最后注册的未被清除的日志提供程序,大部分开发者在集成Serilog时会调用ClearProviders()清除默认日志提供程序,或者只注册了Serilog作为唯一的日志提供程序,因此默认接口输出的日志只会进入Serilog,NLog虽然初始化成功生成了文件,但没有收到需要写入的日志内容。
修复方案
方案1:分别使用两套日志的原生实例独立输出
不需要依赖.NET的ILogger抽象,分别初始化两套日志的原生实例,各自管理输出逻辑:- NLog侧直接使用静态实例输出:
private readonly NLog.Logger _nlog = NLog.LogManager.GetLogger("BusinessLog");,调用_nlog.Info("待输出内容")即可直接写入NLog配置的目标文件 - Serilog侧可继续绑定
ILogger作为业务默认日志输出,也可直接调用Serilog.Log.Information("待输出内容")输出
- NLog侧直接使用静态实例输出:
方案2:同时注册两个日志提供程序,让默认
ILogger输出的内容同时写入两个组件
在服务注册阶段不要调用日志的ClearProviders()方法,按顺序注册两个提供程序即可,.NET 6+ 示例代码如下:var builder = WebApplication.CreateBuilder(args); // 注册NLog日志提供程序 builder.Logging.AddNLog("nlog.config"); // 注册Serilog日志提供程序,不要调用ClearProviders()清除已注册的NLog builder.Host.UseSerilog((context, loggerConfig) => { loggerConfig .ReadFrom.Configuration(context.Configuration) .WriteTo.File("logs/serilog-.log", rollingInterval: RollingInterval.Day); });如果已经调用了
ClearProviders(),可以在注册完Serilog之后再补注册NLog,或者开启Serilog的转发配置:builder.Host.UseSerilog((context, loggerConfig) => { loggerConfig .ReadFrom.Configuration(context.Configuration) .WriteTo.File("logs/serilog-.log", rollingInterval: RollingInterval.Day); }, writeToProviders: true); // 开启后Serilog会将收到的所有日志转发给其他已注册的日志提供程序额外排查点:如果按上述配置操作后NLog还是空文件,检查NLog配置的日志级别过滤规则,确认你输出的日志级别高于等于NLog配置的最低输出级别,可开启NLog内部日志排查错误:
<nlog internalLogFile="logs/nlog-internal.log" internalLogLevel="Debug"> <!-- 你的其他NLog配置内容 --> </nlog>生成的内部日志会打印配置加载错误、日志过滤规则、写入异常等信息,可快速定位问题。
内容的提问来源于stack exchange,提问作者Ummar
相关产品推荐
相关产品推荐

