簡體   English   中英

如何為不同的接收器以不同的方式覆蓋 Serilog 級別?

[英]How can I override Serilog levels differently for different sinks?

我的場景是:文件接收器應該包含所有內容。 另一個接收器應包含信息消息,但需要注意的是 Microsoft.* 消息很煩人,因此這些消息應僅限於警告。 兩個sink如何分開配置? 我嘗試的第一件事是:

string outputTemplate = "[{Level:u3}] {SourceContext}: {Message:lj}{NewLine}";

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.File("Logs/all.log", outputTemplate: outputTemplate)

    .MinimumLevel.Information()
    .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Warning)
    .WriteTo.File("Logs/some.log", outputTemplate: outputTemplate)
    .CreateLogger();

var msLogger = Log.Logger.ForContext(Constants.SourceContextPropertyName, "Microsoft.AspNet.Example");
var logger = Log.Logger.ForContext(Constants.SourceContextPropertyName, "MyClass");

msLogger.Verbose("example log; should not go in the minimal file");
msLogger.Information("example log; should not go in the minimal file");
msLogger.Warning("example log");
logger.Verbose("example log; should not go in the minimal file");
logger.Information("example log");

在這種情況下,兩個日志文件都是選擇性的,並且“all.log”不包含所有日志消息。 接下來,我嘗試使用子記錄器來完成此操作:

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.File("Logs/all.log", outputTemplate: outputTemplate)

    .WriteTo.Logger(lc => lc
        .MinimumLevel.Information()
        .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Warning)
        .WriteTo.File("Logs/some.log", outputTemplate: outputTemplate))
        .CreateLogger();

此配置效果更好,但較小的日志文件仍然包含應該被.MinimumLevel.Override()選項阻止的這一行:

[INF] Microsoft.AspNet.Example: example log; should not go in the minimal file

使用過濾器確實有效,但我更喜歡簡單的語法,因此更容易配置。

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.File("Logs/all.log", outputTemplate: outputTemplate)

    .WriteTo.Logger(lc => lc
        .MinimumLevel.Information()
        .Filter.ByExcluding(logEvent =>
            logEvent.Level < LogEventLevel.Warning &&
            Matching.FromSource("Microsoft").Invoke(logEvent))
        .WriteTo.File("Logs/some.log", outputTemplate: outputTemplate))
        .CreateLogger();

這是一個錯誤嗎? 為什么過濾器有效但設置最低級別無效?

不幸的是,子記錄器根本不支持MinimumLevel.Override() 在下面的問題中查看更多信息:

錯誤:MinimumLevel 覆蓋忽略 LogEvent #1382 的SourceContext

.Filter.ByExcluding目前是一個很好的解決方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM