如何强制输出启动与关闭事件日志,不受日志过滤级别限制?
强制输出启动/关闭日志(不受日志级别限制)
推荐几个简单优雅的实现方式,比早年的ForContext方案更直接:
1. 用AuditSink(最推荐,优雅且无冗余)
Serilog的AuditSink天生就是用来记录必须留存的关键事件,不管当前日志级别设置如何,只要你调用了日志方法,它就会强制输出。
配置示例:
var loggerConfig = new LoggerConfiguration() .MinimumLevel.Information() // 常规日志只记录Info及以上 .WriteTo.File("app.log") // 常规日志输出,受级别限制 .AuditTo.File("system_events.log", restrictedToMinimumLevel: LogEventLevel.Information); // 审计Sink强制记录 // 启动事件 Log.Logger.Information("应用启动完成"); // 关闭事件(记得在程序退出时触发) AppDomain.CurrentDomain.ProcessExit += (_, __) => Log.Logger.Information("应用已关闭");
审计Sink的文件会单独记录启动/关闭这类关键事件,完全不受主日志级别的影响,逻辑清晰且不会污染常规日志。
2. 给关键事件加标记,通过过滤器强制放行
如果不想拆分日志文件,可以给启动/关闭事件加个专属标记,然后在Sink的过滤器里强制让这些事件通过:
var loggerConfig = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.File("combined.log", filter: (evt, level) => level >= LogEventLevel.Information || evt.Properties.ContainsKey("LifecycleEvent")); // 强制放行带标记的事件 // 记录启动事件 Log.Logger.ForContext("LifecycleEvent", true).Information("应用启动完成"); // 记录关闭事件 Log.Logger.ForContext("LifecycleEvent", true).Information("应用已关闭");
这种方法不需要额外Sink,只要给关键事件加个上下文属性,过滤器就会无视级别限制把它们写入日志。
3. 直接用最低级别日志(最简单粗暴)
如果对日志量没什么要求,直接用Verbose级别记录启动/关闭,同时让Sink包含这个最低级别:
var loggerConfig = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.File("app.log", restrictedToMinimumLevel: LogEventLevel.Verbose); // 允许记录Verbose级别的日志 // 启动事件 Log.Logger.Verbose("应用启动完成"); // 关闭事件 Log.Logger.Verbose("应用已关闭");
这个方法零额外配置,但要注意如果有其他Verbose级别的日志也会被一起记录,适合小型应用场景。
内容的提问来源于stack exchange,提问作者PieterV
相关产品推荐
相关产品推荐

