我正在使用Serilog - RollingFile Sink,但它将所有数据存储在一个文件中一天。 在我的应用程序中,每天写入1 GB的日志。所以我想根据日期和大小滚动日志文件。
如何根据日期和大小配置RollingFile Sink来滚动文件?
答案 0 :(得分:1)
我相信您正在寻找RollingFile接收器的替代实现:
Serilog滚动文件接收器(替代)
这是一个滚动文件接收器,允许您根据文件大小指定翻转行为。 https://github.com/BedeGaming/sinks-rollingfile
答案 1 :(得分:1)
不建议使用Serilog.Sinks.RollingFile软件包,而推荐使用Serilog.Sinks.File(请参阅github项目readme简介)。 Serilog.Sinks.File软件包已升级以支持文件滚动。 您可以使用以下Serilog配置来启用按时间和大小滚动:
"Serilog": {
"Using": ["Serilog.Sinks.File"],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "logs/log.txt",
"rollingInterval": "Day",
"rollOnFileSizeLimit": true,
"fileSizeLimitBytes": "512",
"retainedFileCountLimit": 3,
"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog"
}
}
]
}
然后您将得到如下内容:
答案 2 :(得分:0)
为了避免将具有失控磁盘使用率的应用程序置于滚动文件中 sink默认将文件大小限制为1GB。限制可以更改或 使用fileSizeLimitBytes参数删除。
.WriteTo.RollingFile("log-{Date}.txt", fileSizeLimitBytes: null)
该示例显示通过将限制设置为null
来删除限制。在您的情况下,将其设置为适当的大小。
<强>更新强>
是的,根据您的评论,我查看了源代码,看起来RollingFileSink的最低计量单位是一天,因此在同一天拥有多个单位似乎不受支持。但是,我并没有仔细观察,看起来RollingFileSink.cs中的OpenFile
方法与序列号有关。您可能想看一看该代码正在做什么。
答案 3 :(得分:0)
当前版本还实现每小时滚动。 这可能是你问题的另一种解决方案。
{Hour}每小时创建一个文件。文件名使用yyyyMMddHH格式。
像: .WriteTo.RollingFile(&#34;对数似{日期}·小时&#34)
答案 4 :(得分:0)
在appsettings.json中,您应该这样写:
{
"Serilog": {
"Using": ["Serilog.Sinks.File"],
"MinumumLevel": {
"Default": "Error",
"Override": {
//"Microsoft": "Warning",
//"System": "Warning",
"Microsoft.AspNetCore.Authentication": "Verbose",
"WebApplicationLogger1.Startup": "Warning",
"WebApplicationLogger1.Pages": "Warning"
}
},
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"rollingInterval": "Day", // --> THIS IS THAT YOU NEED
"pathFormat": "C:\\Logfiles\\File-{Date}.log",
"restrictedToMinimumLevel": "Warning"
}
}
],
}
}
答案 5 :(得分:0)
这是我的解决方法
private readonly Serilog.ILogger _logger; //= Log.ForContext( "Name", "Weather" );
public WeatherForecastController() {
string subPath = Path.Combine( DateTime.Now.ToString( "yyyy" ), DateTime.Now.ToString( "MM" ) ) + $"/{DateTime.Now.ToString("dd")}_Weather";
_logger = Log.ForContext( "Name", subPath );
}
.UseSerilog( ( hostingContext, loggerConfiguration ) => loggerConfiguration
.ReadFrom.Configuration( hostingContext.Configuration )
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.Map(
"Name",
"Request",
( name, wt ) => {
if (name == "Request")
wt.RollingFile( Path.Combine( $"{hostingContext.Configuration["LogPath"]}/{{Date}}-{name}.txt" ) );
else
wt.File( $"{hostingContext.Configuration["LogPath"]}/{name}.txt" );
} )
);