Serilog 滚动文件
Serilog RollingFile
我正在尝试将 WriteTo.RollingFile
与 Serilog 一起使用,如下所示,每天写入一个文件:
var log = new LoggerConfiguration().WriteTo.RollingFile(
@"F:\logs\log-{Date}.txt",
LogEventLevel.Debug).CreateLogger();
log.Information("this is a log test");
但我正在为同一天的每个日志条目获取一个新的日志文件!
如何配置 Serilog 每天写入一个新文件,以便每天有一个日志文件?
是否有任何归档过程可以删除超过 7 天的文件?
试试下面的方法:
var log = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.File(@"f:\log\log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
日志文件名将自动为 log-20150819.txt 等。您无需指定 date.Old 文件将按照 retainedFileCountLimit 进行清理 - 默认值为 31。
作为对此的后续行动,请确保您随后使用全局范围的 "Log" 实例。
示例:
Log.Information("Hello world");
这是在 asp.net MVC 4/5 应用程序中通过 web.config 使用 Serilog 的方法。
在您的 web.config 中添加以下内容:
<add key="serilog:minimum-level" value="Information" />
<add key="serilog:minimum-level:override:Microsoft" value="Information" />
<add key="serilog:minimum-level:override:System" value="Information" />
<add key="serilog:using:RollingFile" value="Serilog.Sinks.RollingFile" />
<add key="serilog:write-to:RollingFile.pathFormat" value="./Logs/log-{Date}.txt" />
<add key="serilog:write-to:RollingFile.outputTemplate" value="{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] [{SourceContext}] {Message}{NewLine}{Exception}" />
<add key="serilog:write-to:RollingFile.retainedFileCountLimit" value="10" />
然后在global.asax的Application_Start
中添加以下内容:
// Get application base directory
string basedir = AppDomain.CurrentDomain.BaseDirectory;
// Setup Serilog for logging
Log.Logger = new LoggerConfiguration()
.ReadFrom.AppSettings()
.WriteTo.RollingFile(basedir + "/Logs/log-{Date}.txt")
.CreateLogger();
要使用相同的文件,您必须添加 shared: true
.WriteTo.RollingFile("log-{Date}.txt", shared: true)
WriteTo.RollingFile 已弃用
自发布答案以来,方法 RollingFile
不再可行,取而代之的是 File
和滚动日志的选项。
现在必须使用支持滚动的标准 Serilog.Sinks.File
NuGet 包:
.WriteTo.File(path: @"e:\logs\skilliam.log",
rollingInterval: RollingInterval.Day,
rollOnFileSizeLimit: true,
fileSizeLimitBytes: 123456);
要启用多进程共享日志文件,将共享设置为真:
在代码中
.WriteTo.RollingFile("log-{Date}.txt", shared: true)
或在web.config
<add key="serilog:write-to:RollingFile.shared" value="true" />
我是这样做的:
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" );
} )
);
WriteTo.RollingFile 已弃用 -> 使用格式化程序
如果使用文本格式化程序 ITextFormatter
,请注意 path
的变量位置在使用 File
时已切换到第二位。
因此请将此格式与格式化程序一起使用:
var filepath = @"C:\Logs";
ITextFormatter jsonFormatter = new Serilog.Formatting.Json.JsonFormatter(renderMessage: true);
...
Log.Logger = new LoggerConfiguration()
... // Enrichers etc...
.WriteTo.File(formatter: jsonFormatter,
path: filepath,
rollingInterval: RollingInterval.Day,
rollOnFileSizeLimit: true,
fileSizeLimitBytes: 123456,
shared: true)
.CreateLogger();
我正在尝试将 WriteTo.RollingFile
与 Serilog 一起使用,如下所示,每天写入一个文件:
var log = new LoggerConfiguration().WriteTo.RollingFile(
@"F:\logs\log-{Date}.txt",
LogEventLevel.Debug).CreateLogger();
log.Information("this is a log test");
但我正在为同一天的每个日志条目获取一个新的日志文件!
如何配置 Serilog 每天写入一个新文件,以便每天有一个日志文件?
是否有任何归档过程可以删除超过 7 天的文件?
试试下面的方法:
var log = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.File(@"f:\log\log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
日志文件名将自动为 log-20150819.txt 等。您无需指定 date.Old 文件将按照 retainedFileCountLimit 进行清理 - 默认值为 31。
作为对此的后续行动,请确保您随后使用全局范围的 "Log" 实例。
示例:
Log.Information("Hello world");
这是在 asp.net MVC 4/5 应用程序中通过 web.config 使用 Serilog 的方法。
在您的 web.config 中添加以下内容:
<add key="serilog:minimum-level" value="Information" />
<add key="serilog:minimum-level:override:Microsoft" value="Information" />
<add key="serilog:minimum-level:override:System" value="Information" />
<add key="serilog:using:RollingFile" value="Serilog.Sinks.RollingFile" />
<add key="serilog:write-to:RollingFile.pathFormat" value="./Logs/log-{Date}.txt" />
<add key="serilog:write-to:RollingFile.outputTemplate" value="{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] [{SourceContext}] {Message}{NewLine}{Exception}" />
<add key="serilog:write-to:RollingFile.retainedFileCountLimit" value="10" />
然后在global.asax的Application_Start
中添加以下内容:
// Get application base directory
string basedir = AppDomain.CurrentDomain.BaseDirectory;
// Setup Serilog for logging
Log.Logger = new LoggerConfiguration()
.ReadFrom.AppSettings()
.WriteTo.RollingFile(basedir + "/Logs/log-{Date}.txt")
.CreateLogger();
要使用相同的文件,您必须添加 shared: true
.WriteTo.RollingFile("log-{Date}.txt", shared: true)
WriteTo.RollingFile 已弃用
自发布答案以来,方法 RollingFile
不再可行,取而代之的是 File
和滚动日志的选项。
现在必须使用支持滚动的标准 Serilog.Sinks.File
NuGet 包:
.WriteTo.File(path: @"e:\logs\skilliam.log",
rollingInterval: RollingInterval.Day,
rollOnFileSizeLimit: true,
fileSizeLimitBytes: 123456);
要启用多进程共享日志文件,将共享设置为真:
在代码中
.WriteTo.RollingFile("log-{Date}.txt", shared: true)
或在web.config
<add key="serilog:write-to:RollingFile.shared" value="true" />
我是这样做的:
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" );
} )
);
WriteTo.RollingFile 已弃用 -> 使用格式化程序
如果使用文本格式化程序 ITextFormatter
,请注意 path
的变量位置在使用 File
时已切换到第二位。
因此请将此格式与格式化程序一起使用:
var filepath = @"C:\Logs";
ITextFormatter jsonFormatter = new Serilog.Formatting.Json.JsonFormatter(renderMessage: true);
...
Log.Logger = new LoggerConfiguration()
... // Enrichers etc...
.WriteTo.File(formatter: jsonFormatter,
path: filepath,
rollingInterval: RollingInterval.Day,
rollOnFileSizeLimit: true,
fileSizeLimitBytes: 123456,
shared: true)
.CreateLogger();