gpt4 book ai didi

c# - 如何为不同的接收器以不同的方式覆盖 Serilog 级别?

转载 作者:行者123 更新时间:2023-12-04 04:06:49 34 4
gpt4 key购买 nike

我的场景是:文件接收器应该包含所有内容。另一个接收器应包含信息消息,但需要注意的是 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()子记录器根本不支持。在下面的问题中查看更多信息:

Bug: MinimumLevel override ignores SourceContext of LogEvent #1382


.Filter.ByExcluding目前是一个很好的解决方法。

关于c# - 如何为不同的接收器以不同的方式覆盖 Serilog 级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62341787/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com