求助:Serilog配置后无法写入指定文件路径Logs/Error/applog.log
日志未写入指定路径的原因及修复方案
1. 第一版配置的结构与用法完全错误
第一版配置把WriteTo直接放在JSON根节点,而Serilog通过ReadFrom.Configuration读取配置时,默认只会识别根节点下的Serilog节点(ASP.NET Core项目则是Logging:Serilog节点),根节点直接写WriteTo不会被解析。
另外你嵌套用configureLogger添加File sink的写法也不对,configureLogger是用来配置子记录器(比如针对特定日志上下文的独立logger),不是用来追加sink的,这种写法根本不会生效。再加上第一个File sink没有任何Args参数,等于完全没配置有效输出路径,自然不会生成日志。
2. 第二版配置的读取逻辑有遗漏
第二版配置是标准的ASP.NET Core风格(放在Logging:Serilog下),但你的代码直接读取appsettings.json后传给Serilog,默认情况下Serilog会优先读取根节点的Serilog配置,而非Logging:Serilog。要让它读取这个节点,得手动指定配置路径:
var Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration, sectionName: "Logging:Serilog") .CreateLogger();
3. 可能存在的其他问题
- 日志级别过滤:第二版配置里的
Logging:LogLevel是ASP.NET Core的日志过滤,Serilog自身的级别过滤需要在Serilog配置里加MinimumLevel节点,比如:
不过你输出的是"Serilog": { "MinimumLevel": { "Default": "Information" }, "WriteTo": [/* 你的File配置 */] }Information级别,大概率不会被过滤,但还是要确认配置是否覆盖了级别。 - 权限与目录问题:确保程序有写入
Logs/Error目录的权限,Serilog会自动创建不存在的目录,但权限不足会静默失败。 - NuGet包缺失:必须安装
Serilog.Sinks.File和Serilog.Settings.Configuration这两个包,缺少的话File sink根本不会生效。
标准配置示例(推荐)
直接在根节点定义Serilog配置,这样代码无需额外指定section:
{ "Serilog": { "MinimumLevel": { "Default": "Information" }, "WriteTo": [ { "Name": "File", "Args": { "path": "Logs/Error/applog.log", "outputTemplate": "{Timestamp:o} [Thread:{ThreadId}] [{Level:u3}] ({SourceContext}) {Message}{NewLine}{Exception}", "rollingInterval": "Day", "retainedFileCountLimit": 7 } } ] }, "AllowedHosts": "*", "ConnectionStrings": { "HrSoultion": "server=.;database=Maqta;Trusted_Connection=True;MultipleActiveResultSets=true;TrustServerCertificate=True" } }
内容的提问来源于stack exchange,提问作者user123456
相关产品推荐
相关产品推荐

