如何为Serilog file sink生成的日志文件添加自定义文件名并引用fileName变量
Serilog文件名变量替换解决方案
你遇到的变量未替换问题,本质是路径中的占位符没有在配置阶段被正确解析,按以下方式处理即可:
1. 固定主机名(全局唯一文件名前缀)场景
你要加入的主机名是全局固定值,直接提前获取主机名赋值给变量,保证配置Serilog时变量已完成赋值,C#字符串插值会直接完成变量替换,不需要Serilog额外处理:
// 提前获取主机名赋值给fileName变量,确保在Serilog配置前执行 var fileName = Environment.MachineName; vservices.AddLogging(logging => logging.AddSerilog( new LoggerConfiguration() // 如果要在日志内容里输出fileName,加上这行注入全局属性 .Enrich.WithProperty("fileName", fileName) .WriteTo.RollingFile( path: Path.Combine(Environment.CurrentDirectory, $"log-{fileName}.txt"), outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {fileName}, {Message:lj}{NewLine}{Exception}" ) .CreateLogger() ));
注意:不要漏掉字符串前的
$符号,没有$的普通字符串不会触发C#插值,就会原样输出{fileName}占位符。
2. 动态fileName(不同日志对应不同文件名)场景
如果需要根据日志的上下文属性动态生成文件名,原生的RollingFile Sink不支持路径参数的属性解析,需要搭配Serilog.Sinks.Map实现:
vservices.AddLogging(logging => logging.AddSerilog( new LoggerConfiguration() // 日志上下文里要有fileName属性,这里可以是全局注入也可以是打日志时动态添加 .Enrich.FromLogContext() .WriteTo.Map( propertyName: "fileName", defaultKey: "unknown", (fileName, writeTo) => writeTo.RollingFile( Path.Combine(Environment.CurrentDirectory, $"log-{fileName}.txt"), outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {fileName}, {Message:lj}{NewLine}{Exception}" ) ) .CreateLogger() ));
内容的提问来源于stack exchange,提问作者user584018
相关产品推荐
相关产品推荐

