You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何强制输出启动与关闭事件日志,不受日志过滤级别限制?

强制输出启动/关闭日志(不受日志级别限制)

推荐几个简单优雅的实现方式,比早年的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:51:03