C#控制台应用使用Serilog无日志输出问题排查
Serilog配置文件失效无日志输出的常见原因
1. 配置文件未复制到输出目录
检查logSettings.json的属性:右键文件→属性→复制到输出目录,设置为始终复制或如果较新则复制。如果文件没被同步到程序运行目录,Serilog找不到配置,会默认静默不输出日志(这是Serilog的容错机制,不会抛出错误)。
2. 配置文件格式或节点不符合Serilog要求
确保JSON结构符合Serilog的规范,根节点必须是Serilog,核心节点如MinimumLevel、WriteTo不能写错。示例正确结构:
{ "Serilog": { "MinimumLevel": { "Default": "Warning", "Override": { "Microsoft": "Error", "System": "Error" } }, "WriteTo": [ { "Name": "Console" }, { "Name": "File", "Args": { "path": "Logs/log-.txt", "rollingInterval": "Day" } } ] } }
注意节点名称大小写敏感,比如把MinimumLevel写成minimumLevel会被Serilog忽略。
3. 自定义MyLoggerFactory未正确加载配置
检查配置加载代码,必须用Serilog的ReadFrom.Configuration()方法绑定配置。示例正确的初始化逻辑:
var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("logSettings.json") .Build(); Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(config) .CreateLogger();
如果自定义工厂里没有正确完成这段绑定,Serilog会使用默认的空配置,自然没有日志输出。
4. 日志级别配置过高
检查MinimumLevel.Default是否设为Error或Fatal,这种情况下LogWarning的日志级别低于阈值,不会被输出。另外要确认是否有程序集级别的Override设置,比如把当前项目的日志级别强制设为Error,覆盖了默认的Warning。
5. 未完成Serilog初始化或未刷新日志
控制台应用启动时必须初始化Serilog,并且在程序退出前调用Log.CloseAndFlush()——文件Sink会缓冲日志,不调用此方法的话,程序退出时缓冲的日志会丢失。另外要确认自定义工厂是否正确替换了默认日志提供者,避免代码实际使用的是默认空日志器而非Serilog实例。
内容的提问来源于stack exchange,提问作者Daviid
相关产品推荐
相关产品推荐

