首页 > 解决方案 > Serilog 范围级别过滤

问题描述

在 log4net 中,您可以选择使用 levelMin levelMax 范围声明不同的 fileappender。这样,您可以拥有一个用于调试的文件和一个用于错误的文件。如何在 serilog 文件接收器中具有相同的行为。我有此代码,但您只能指定 MinimumLevel

Log.Logger = new LoggerConfiguration()
            .WriteTo.Async(a =>
            {
                a.RollingFile($"{AppDomain.CurrentDomain.BaseDirectory}\\Logs\\error.txt", 
                    restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Error);
            })
            .WriteTo.Async(a =>
            {
                a.RollingFile($"{AppDomain.CurrentDomain.BaseDirectory}\\Logs\\log.txt",
                    restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Debug);
            })
            .CreateLogger();

它创建了两个文件,但在 log.txt 我还看到了错误级别消息

标签: c#.net.net-coreserilog

解决方案


在 Serilog 中,您可以使用对每个子记录器应用过滤器的子记录器:

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Logger(c =>
        c.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Debug)
            .WriteTo.File("Debug.log"))
    .WriteTo.Logger(c =>
        c.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Error)
            .WriteTo.File("Error.log"))
    .CreateLogger();

Log.Debug("This goes to Debug.log only");
Log.Error("This goes to Error.log only");

Log.CloseAndFlush();

或者,如果您只想将 a 映射到文件,则可以使用Serilog.Sinks.Map 。LogEventLevel

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Map(evt => evt.Level, (level, wt) => wt.File($"{level}.log"))
    .CreateLogger();

Log.Debug("This goes to Debug.log only");
Log.Error("This goes to Error.log only");

Log.CloseAndFlush();

推荐阅读