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

如何获取.NET 7控制台应用中Serilog日志文件的完整路径名?

获取Serilog滚动日志文件的完整路径

针对你的需求,有几种可靠的方法可以获取Serilog写入的日志文件完整路径,以下是具体实现:

方法一:利用官方FileLifecycleHooks跟踪文件路径(推荐)

这是Serilog官方提供的扩展方式,无需依赖内部实现,兼容性最好。通过自定义FileLifecycleHooks,可以在日志文件创建时捕获其完整路径:

  1. 自定义Hook类:
public class TrackLogFileHook : FileLifecycleHooks
{
    public string CurrentFullLogPath { get; private set; }

    public override void OnFileOpened(string path, Stream fileStream)
    {
        CurrentFullLogPath = path;
        base.OnFileOpened(path, fileStream);
    }
}
  1. 配置Serilog时使用该Hook:
var logFileHook = new TrackLogFileHook();

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.Console()
    .WriteTo.File("MyConsoleApp.txt", rollingInterval: RollingInterval.Day, fileLifecycleHooks: logFileHook)
    .CreateLogger();

// 注意:需要至少写入一条日志触发文件创建,才能获取到路径
Log.Information("初始化日志记录");
var fullLogFileName = logFileHook.CurrentFullLogPath;

优点:基于官方公开API,版本兼容性强,能准确捕获滚动后的新日志文件路径。

方法二:手动计算日志文件名

根据Serilog滚动文件的命名规则,手动拼接完整路径。当使用RollingInterval.Day时,文件名格式为[基准名]_[yyyyMMdd].[后缀]:

var baseFileName = "MyConsoleApp.txt";
var dateSuffix = DateTime.Now.ToString("yyyyMMdd");
var fileNameWithoutExt = Path.GetFileNameWithoutExtension(baseFileName);
var fileExt = Path.GetExtension(baseFileName);
var fullLogPath = Path.Combine(Directory.GetCurrentDirectory(), $"{fileNameWithoutExt}_{dateSuffix}{fileExt}");

优点:完全不依赖Serilog内部逻辑,实现简单;缺点:如果后续修改滚动规则(如改为按小时滚动),需要同步修改计算逻辑,否则会失效。

方法三:通过反射访问FileSink内部属性

如果需要直接从Serilog的FileSink实例中获取路径,可以通过反射访问其内部属性(注意:此方法依赖Serilog.Sinks.File的内部实现,版本更新可能导致失效):

// 手动创建FileSink实例并保存引用
var fileSink = new FileSink(
    "MyConsoleApp.txt",
    new MessageTemplateTextFormatter(),
    rollingInterval: RollingInterval.Day
);

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.Console()
    .WriteTo.Sink(fileSink)
    .CreateLogger();

// 写入日志触发文件创建
Log.Debug("测试日志");

// 反射获取内部属性
var pathProperty = fileSink.GetType().GetProperty(
    "CurrentFilePath",
    System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance
);
var fullLogPath = pathProperty?.GetValue(fileSink) as string;

优点:无需手动计算路径;缺点:依赖内部实现,版本兼容性差,不推荐长期使用。


内容的提问来源于stack exchange,提问作者Margo Noreen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:52:38