Serilog不记录库的输出



我正在开发一个遗留的。net Framework控制台应用程序。(无ASP。.NET或.NET核心日志框架)。

VS解决方案包含控制台应用程序项目,以及控制台应用程序所依赖的单独类库项目。

我在两个c#项目中安装了以下与serilog相关的NuGet包:

控制台应用程序组件

  • Serilog 2.10.0
  • Serilog.Enrichers。阐明1.0.1
  • Serilog.Sinks。控制台4.0.0
  • Serilog.Sinks。文件5.0.0
  • 以上各种依赖

图书馆装配

  • Serilog 2.10.0
  • Serilog的直接依赖项

我在控制台应用程序的顶部配置全局静态日志记录器,如下所示:

static void Main(String[] args)
{
// Configure Serilog static logger
Log.Logger = new LoggerConfiguration()
.Enrich.WithDemystifiedStackTraces()
.WriteTo.Console(LogEventLevel.Information)
.WriteTo.File("app-.log", 
rollingInterval: RollingInterval.Day, 
retainedFileCountLimit: 7, 
restrictedToMinimumLevel: LogEventLevel.Debug
)
.CreateLogger();

只要我从控制台应用程序程序集的上下文中调用Log.Information(),Log.Warning(),Log.Error()等,就可以正常工作。

但是当控制台应用程序调用在库程序集中定义的方法时,调用Log.Information()和友元没有明显的效果。预期的日志消息未显示在控制台或文件接收器中。

一旦库方法返回Console程序集,Log静态方法将再次工作。

这是怎么回事?为什么全局静态Log.Logger在库代码的范围内似乎具有不同的配置或行为?文档给我的印象是,我只需要设置一次Log.Logger,然后我就可以在任何地方使用像Log.Information()这样的静态方法。我是否应该通过程序集边界显式地传递我配置的日志记录器,或者以某种方式消除多个全局Log.Logger实例之间的歧义?

好吧,这太尴尬了。我改变了控制台应用程序和类库的目标。net框架版本以及各种其他实验。但事实证明,实际原因是我在类库中的日志消息碰巧是LogEventLevel.DebugLogEventLevel.Verbose日志级别,而调用控制台应用程序中的日志消息是LogEventLevel.Information或更高级别。我被调用在不同的程序集中而没有注意到每个上下文中不同的级别这一事实分散了注意力。

虽然我已经将文件接收器配置为最小LogEventLevel设置为LogEventLevel.Debug,但它没有捕获任何日志消息,因为新的LoggerConfiguration对象具有隐式默认最小日志级别Information。我从来没有重写过这个隐式默认值,因为我没有注意到它在"Serilog Configuration basic"中的描述。文档页面。这意味着类库中的日志事件在接收器有机会看到它们之前就被过滤掉了。

解决方案是将.MinimumLevel.Debug()(或.MinimumLevel.Verbose())添加到LoggerConfiguration:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.WithDemystifiedStackTraces()
.WriteTo.Debug(LogEventLevel.Debug)
.WriteTo.Console(settingsConsoleLogMinimumLevel)
.WriteTo.File("tadloader-.log", 
rollingInterval: RollingInterval.Day, 
retainedFileCountLimit: settings.LogFileCount, 
restrictedToMinimumLevel: settingsLogFileMinimumLevel
)
.CreateLogger();

最新更新