Serilog:防止创建空的日志文件

3

编辑: 下面的被接受的答案部分地起作用。 它确实推迟了文件的创建,但它不尊重最小的LogEventLevel(因为每当记录发生时,即使最终不写入文件,也会调用推迟的行)。 然而,它确实实现了我的总体目标“无空文件创建”(我将在应用程序中记录错误),因此我将其保留为被接受的答案。

我的最终代码如下:

new LoggerConfiguration().WriteTo.Map("", "", (_, writeTo) => writeTo.File("SampleName.log")).CreateLogger();

我有一个简单的控制台应用程序,其中使用了Serilog和文件汇聚。

new LoggerConfiguration().WriteTo.File("SampleName.log", LogEventLevel.Error).CreateLogger();

理想情况下,我只希望当需要记录日志(在我的情况下为错误)时,它才会在磁盘上创建一个日志文件。然而,如果应用程序运行并且没有发生错误就完成了,Serilog仍然会创建一个空文件。有没有一种方法可以指示Serilog只在有东西要记录时才创建文件?
1个回答

3
截至目前为止,这是不可能的。文件在创建FileSink实例时就被创建到磁盘上了,并且没有配置选项可以更改这种行为。
您可以创建一个包装FileSink懒惰地创建FileSink实例的接收器,每当第一个日志事件发出时才会创建实例。
或者,在应用程序结束之前(但在调用Log.CloseAndFlush之后),您可以删除空文件。

1
@RubenBartelink 好想法。Serilog.Sinks.Map 可能有效,因为它在发出日志事件时创建了汇聚器。/cc @DoctorBlue - C. Augusto Proiete
下次有空一定要看看Map(https://github.com/serilog/serilog-sinks-map)!看起来正是我需要的东西,可以省去制作惰性汇集器包装的麻烦。 - Doctor Blue
2
@DoctorBlue 如果你所烦恼的是在你的应用程序 .exe 旁边有一个空文件,那么你可能需要考虑另一件事情,即将日志文件存储在其他地方,例如 %localappdata%\yourapp\yourapp.log,这样它就始终不会被看到... 这是我通常使用我的应用程序的方式,因为只有在排除故障时才会偶尔检查日志... Serilog.Sinks.Map 非常酷且非常有用,可以将特定属性映射到接收器,但我个人不会仅仅为了避免空日志文件而在我的日志记录管道中增加 Serilog.Sinks.Map 的开销。 - C. Augusto Proiete
@CaioProiete 我本来会把它们保存起来的,但是由于这个特定需求周围的情况不允许我这样做。 - Doctor Blue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接