You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:51:02