我的情况是:文件接收器应包含所有内容。另一个接收器应包含“信息”消息,但要注意Microsoft。*消息很烦人,因此这些消息应仅限于“警告”。如何分别配置两个接收器?我尝试的第一件事是:
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();
这是一个错误吗?为什么过滤器可以工作,但不能设置最低水平呢?
答案 0 :(得分:1)
不幸的是,子记录器根本不支持MinimumLevel.Override()
。在以下问题中查看更多信息:
目前,Bug: MinimumLevel override ignores
SourceContext
of LogEvent #1382
.Filter.ByExcluding
是一个很好的解决方法。