如何将Serilog LoggingLevelSwitch配置移至app.config实现运行时日志级别切换
如何在app.config中配置Serilog的LoggingLevelSwitch初始级别
好问题!Serilog本身并没有内置支持直接在app.config中定义LoggingLevelSwitch,但我们可以通过配置文件读取+代码绑定的方式,实现让初始日志级别从配置文件加载,同时保留运行时动态切换级别的能力。下面是具体的实现方案:
方案1:使用appSettings节点(简单直接)
第一步:修改app.config配置
在<appSettings>中添加自定义的初始级别配置项,同时保留Serilog的基础配置:
<configuration> <appSettings> <!-- Serilog基础配置(示例:输出到控制台) --> <add key="Serilog:Using" value="Serilog.Sinks.Console" /> <add key="Serilog:WriteTo:Console" /> <!-- 自定义初始日志级别:可选值为Verbose/Debug/Information/Warning/Error/Fatal --> <add key="Serilog:MinimumLevel:Initial" value="Verbose" /> </appSettings> </configuration>
第二步:编写代码读取配置并初始化LevelSwitch
从配置文件读取初始级别,创建LoggingLevelSwitch后绑定到Serilog配置:
using Serilog; using Serilog.Events; using System.Configuration; // 从app.config读取初始级别,配置无效时使用默认值Information var initialLevelStr = ConfigurationManager.AppSettings["Serilog:MinimumLevel:Initial"]; if (!Enum.TryParse<LogEventLevel>(initialLevelStr, out var initialLevel)) { initialLevel = LogEventLevel.Information; } // 初始化级别开关 var levelSwitch = new LoggingLevelSwitch(initialLevel); // 配置并创建Logger var logger = new LoggerConfiguration() .ReadFrom.AppSettings() // 读取app.config中的Serilog基础配置 .MinimumLevel.ControlledBy(levelSwitch) // 用开关控制最小级别 .CreateLogger(); // 测试逻辑和之前一致 logger.Verbose("This gets logged (初始级别为Verbose时)"); levelSwitch.MinimumLevel = LogEventLevel.Warning; logger.Verbose("This does not get logged (切换到Warning后)");
方案2:使用Serilog专属配置节(更规范)
如果希望配置更贴合Serilog的结构,可以注册Serilog的配置节:
第一步:修改app.config
先注册Serilog配置节,再添加初始级别配置:
<configuration> <configSections> <!-- 注册Serilog配置节 --> <section name="serilog" type="Serilog.Configuration.SerilogSection, Serilog" /> </configSections> <serilog> <!-- Serilog基础配置 --> <writeTo> <add name="Console" /> </writeTo> <!-- 自定义初始日志级别 --> <minimumLevel initial="Verbose" /> </serilog> </configuration>
第二步:代码读取配置节
从Serilog配置节中读取初始级别:
using Serilog; using Serilog.Configuration; using Serilog.Events; using System.Configuration; // 读取Serilog配置节 var serilogSection = ConfigurationManager.GetSection("serilog") as SerilogSection; // 配置不存在时使用默认级别 var initialLevel = serilogSection?.MinimumLevel?.Initial ?? LogEventLevel.Information; var levelSwitch = new LoggingLevelSwitch(initialLevel); var logger = new LoggerConfiguration() .ReadFrom.AppSettings() .MinimumLevel.ControlledBy(levelSwitch) .CreateLogger();
关键说明
- 两种方案都能实现初始级别从配置文件加载,同时完全保留你之前的运行时动态切换逻辑(
levelSwitch.MinimumLevel = ...)。 - 注意
LogEventLevel的枚举值要严格匹配(区分大小写),配置错误时代码会自动 fallback 到默认级别,避免程序崩溃。
内容的提问来源于stack exchange,提问作者Luc
相关产品推荐
相关产品推荐

