WPF .NET Core 5 多Serilog独立日志配置被最后项覆盖问题求解
问题根因
出现配置覆盖、日志串写的核心原因是AddSerilog()扩展方法的默认行为:每次调用该方法传入Serilog实例时,会默认将该实例赋值给Serilog全局静态属性Log.Logger,后续所有通过ILogger接口写出的日志,默认都会路由到这个最新的全局Serilog实例,因此之前创建的logger最后也会把日志写到最后配置的文件路径下。
解决方案
创建每个独立LoggerFactory绑定对应Serilog实例时,调用AddSerilog方法传入关键参数preserveStaticLogger: true,禁止该方法修改全局静态Log.Logger,从根源上避免不同实例互相覆盖。
修正后的可直接运行代码如下:
// 许可证管理器日志配置 var serilogLM = new LoggerConfiguration() .MinimumLevel.Verbose() .WriteTo.File( $"{LogPathSettings.LicenseManagerLogPath}/LicenseManager {LogPathSettings.ShortDateTime}.log", outputTemplate: "{Timestamp:dd-MM-yyyy HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}") .CreateLogger(); var licenseManagerLogger = LoggerFactory.Create(l => { // 绑定当前自定义Serilog实例,禁止修改全局静态Logger l.AddSerilog(serilogLM, dispose: true, preserveStaticLogger: true); }).CreateLogger("LicenseManager"); // 客户端日志配置 var serilogClient = new LoggerConfiguration() .MinimumLevel.Verbose() .WriteTo.File($"{LogPathSettings.ClientLogPath}/Client {LogPathSettings.ShortDateTime}.log", outputTemplate: "{Timestamp:dd-MM-yyyy HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}") .CreateLogger(); var clientLogger = LoggerFactory.Create(l=> { // 独立绑定当前Serilog实例,不覆盖其他日志配置 l.AddSerilog(serilogClient, dispose: true, preserveStaticLogger: true); }).CreateLogger("RedClient");
注意事项
- 按上述方式创建的多个
LoggerFactory是完全独立的实例,各自绑定的Serilog配置互不干扰,生成的ILogger实例会完全按照自己对应的配置写入指定文件,不会出现串写问题 - 后续新增第三个、第四个独立日志实例时,按照相同模式创建即可,只要保证传入
preserveStaticLogger: true参数,就不会出现配置覆盖问题 - 应用退出时记得手动Dispose创建的Serilog实例和对应的
LoggerFactory,保证日志缓冲区内容全部写入文件,避免日志丢失
内容的提问来源于stack exchange,提问作者zmuro
相关产品推荐
相关产品推荐

