最近,我专注于Serilog
,以指出基于每个LogEvent
的当前日期的模板化路径。在弄清楚如何实现这一点之后,我终于通过使用LogEvent
将Date字段转换为Serilog.Sinks.Map
来动态地解决了路径,如下所示:
return new LoggerConfiguration().WriteTo
.Map(
// Log key
(LogEvent le) => le.Timestamp.Date,
// Log Action
(DateTime date, LoggerSinkConfiguration lc) =>
{
string path = GetFilesPath(date, logName);
lc.File(path);
}
);
public string GetFilePath(DateTime date, string logName) =>
Path.Combine("./Logs", $"{date:yyyy-MM-dd}", $"{logName}.log");
这样,我实现了我的目标:根据日期在子文件夹中写入日志。
问题是,由于Serilog
不知道指向路径已更改,因此它没有按预期方式关闭或处理文件流。因此,我的应用程序无限制地每天打开文件。
[如果有人遇到了这种方法,可以手动关闭流,或者Serilog
API以某种方式公开地自动关闭那些流,那就太好了。
顺便说一句,我正在使用
Serilog.Sinks.Map接受参数sinkMapCountLimit
来控制它:
return new LoggerConfiguration().WriteTo
.Map(
// Log key
(LogEvent le) => le.Timestamp.Date,
// Log Action
(DateTime date, LoggerSinkConfiguration lc) =>
{
string path = GetFilesPath(date, logName);
lc.File(path);
},
sinkMapCountLimit: 5
);