如何获取.NET 7控制台应用中Serilog日志文件的完整路径名?
获取Serilog滚动日志文件的完整路径
针对你的需求,有几种可靠的方法可以获取Serilog写入的日志文件完整路径,以下是具体实现:
方法一:利用官方FileLifecycleHooks跟踪文件路径(推荐)
这是Serilog官方提供的扩展方式,无需依赖内部实现,兼容性最好。通过自定义FileLifecycleHooks,可以在日志文件创建时捕获其完整路径:
- 自定义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); } }
- 配置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
相关产品推荐
相关产品推荐

