修改Serilog日志文件路径到上层目录时路径分隔符乱码问题求助
解决方案
核心原因说明
路径分隔符被替换为特殊字符、仅能写入项目根目录的问题,由两类常见错误导致:
- 低版本
Serilog.Sinks.File存在Windows路径解析缺陷,会将盘符冒号、路径分隔符识别为非法文件名字符替换 - 缺少
Serilog.Settings.Configuration依赖包,或初始化Serilog时未加载appsettings.json配置,导致配置不生效,默认写入项目根目录
修复步骤
1. 依赖版本校验
- 安装/升级
Serilog.Sinks.File到5.0.0及以上版本 - 安装
Serilog.Settings.Configuration包,确保支持从配置文件读取Serilog参数
2. 修正初始化顺序
Serilog必须在应用宿主构建前读取配置完成初始化,参考代码如下:
// 第一步:加载配置文件 var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables() .Build(); // 第二步:从配置初始化Serilog Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(config) .CreateLogger(); // 第三步:初始化应用宿主 try { Log.Information("服务启动中"); var builder = WebApplication.CreateBuilder(args); // 服务注册逻辑... var app = builder.Build(); // 中间件配置逻辑... app.Run(); } catch (Exception ex) { Log.Fatal(ex, "服务启动异常"); } finally { Log.CloseAndFlush(); }
3. 相对路径配置方法
要实现相对路径存储日志,可选择以下两种方式:
- 直接在appsettings.json中配置相对路径,推荐使用正斜杠避免JSON转义问题:
"path": "./structured-logs/logs.txt"
- 代码中显式拼接路径(兼容性更强,可避免部署时工作目录偏移问题):
// 示例:日志存储到程序运行目录上级的structured-logs文件夹下 var logBasePath = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), "../structured-logs")); Directory.CreateDirectory(logBasePath); // 自动创建目录避免写入失败 Log.Logger = new LoggerConfiguration() .WriteTo.File( path: Path.Combine(logBasePath, "logs.txt"), rollingInterval: RollingInterval.Day, outputTemplate: "{Timestamp:G} {Message}{NewLine:1}{Exception:1}") .ReadFrom.Configuration(config) .CreateLogger();
4. 额外排查项
- 确认appsettings.json文件的「复制到输出目录」属性设置为「如果较新则复制」
- 若需在路径中使用环境变量,不要直接写
%变量名%格式,需安装Serilog.Expressions包后使用${Env:变量名}格式解析
内容的提问来源于stack exchange,提问作者baiqilongma
相关产品推荐
相关产品推荐

