Serilog - 多个日志文件
Posted
技术标签:
【中文标题】Serilog - 多个日志文件【英文标题】:Serilog - multiple log files 【发布时间】:2015-04-02 06:37:53 【问题描述】:我正在使用 Serilog 进行日志记录,但无法弄清楚如何将日志事件分隔到不同的文件中。例如,我想将错误记录到 error_log-ddmmyyyy.txt 并将警告记录到 warn_log-ddmmyyyy.txt。
这是我的记录器配置:
Log.Logger = new LoggerConfiguration()
.WriteTo.Logger(lc =>
lc.Filter.ByIncludingOnly(Matching.WithProperty("Level", "Warning"))
.WriteTo.RollingFile(
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Logs\warn_log-Date.txt"),
outputTemplate: OutputTemplate))
.WriteTo.Logger(lc =>
lc.Filter.ByIncludingOnly(Matching.WithProperty("Level", "Error"))
.WriteTo.RollingFile(
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Logs\error_log-Date.txt"),
outputTemplate: OutputTemplate))
.CreateLogger();
仅当我在日志消息中明确指定 Level 属性时才有效。
我正在尝试使用:
Matching.WithProperty<LogEventLevel>("Level", l => l == LogEventLevel.Warning)
但它也没有用。
【问题讨论】:
@Kiquenet,它是 WCF 应用程序。 如何使用 Serilog 在代码中记录错误和警告? @Kiquenet,示例如下:带有异常详细信息的错误消息:Log.Logger.Error(ex, "Here goes error message with Data", someData)
警告消息:Log.Logger.Warning("Here goes warning message with Data", someData)
【参考方案1】:
我使用以下配置,它适用于我:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.LiterateConsole()
.WriteTo.Logger(l => l.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Information).WriteTo.RollingFile(@"Logs\Info-Date.log"))
.WriteTo.Logger(l => l.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Debug ).WriteTo.RollingFile(@"Logs\Debug-Date.log"))
.WriteTo.Logger(l => l.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Warning ).WriteTo.RollingFile(@"Logs\Warning-Date.log"))
.WriteTo.Logger(l => l.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Error ).WriteTo.RollingFile(@"Logs\Error-Date.log"))
.WriteTo.Logger(l => l.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Fatal ).WriteTo.RollingFile(@"Logs\Fatal-Date.log"))
.WriteTo.RollingFile(@"Logs\Verbose-Date.log")
.CreateLogger();
【讨论】:
赞成的不是关于这个问题,而是因为提出了一种干净的解决方案,用于在单独的文件中记录不同的日志级别。 喜欢这个。唯一的问题是如何将其转换为 JSON 配置文件?我试图找到一个语法参考,但由于某种原因未能找到。 我不确定您是否可以在 json 配置中执行此操作。我的 VS 插件在生成 json 时忽略了 Filter 行。【参考方案2】:我认为你需要:
.ByIncludingOnly(evt => evt.Level == LogEventLevel.Warning)
编辑:
在许多情况下,现在使用Serilog.Sinks.Map 更加简洁。有了它,例子可以写成:
Log.Logger = new LoggerConfiuration()
.WriteTo.Map(
evt => evt.Level,
(level, wt) => wt.RollingFile("Logs\\" + level + "-Date.log"))
.CreateLogger();
【讨论】:
...介意看看这个问题,答案中的编辑和最后几个 cmets...***.com/questions/47565008/…【参考方案3】:通常对于我的用例,我需要多个日志,每个日志都包含一个最低级别。这样我以后可以更有效地调查日志。
对于 Serilog 的更新版本,我建议使用这个:
Log.Logger = new LoggerConfiuration()
.MinimumLevel.Debug()
.WriteTo.File(path: "debug.log", rollingInterval: RollingInterval.Day)
.WriteTo.File(path: "info.log", restrictedToMinimumLevel: LogEventLevel.Information, rollingInterval: RollingInterval.Day)
.WriteTo.File(path: "error.log",restrictedToMinimumLevel: LogEventLevel.Error, rollingInterval: RollingInterval.Day)
.WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Warning)
.CreateLogger();
【讨论】:
【参考方案4】:var dateTimeNowString = $"DateTime.Now:yyyy-MM-dd_HH-mm-ss";
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.WriteTo.Logger(
x => x.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Error)
.WriteTo.File($"Logs/dateTimeNowString-Error.log")
)
.WriteTo.Logger(
x => x.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Warning)
.WriteTo.File($"Logs/dateTimeNowString-Warning.log")
)
.WriteTo.File($"Logs/dateTimeNowString-All.log")
.WriteTo.Console()
.CreateLogger();
这些是我的 nuget 包:
<PackageReference Include="Serilog.AspNetCore" Version="2.1.1" />
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
<PackageReference Include="Serilog.Sinks.File" Version="4.0.0" />
【讨论】:
【参考方案5】:另一种变体是在一个文件中包含 ERROR 和 FATAL(而不是一个文件中的错误和另一个文件中的致命)。对我来说似乎有很多文件将它们分开。请记住,可以使用“或”运算符。
Log.Logger = new LoggerConfiguration()
.WriteTo.File("logs\\all.log", rollingInterval: RollingInterval.Day)
.WriteTo.Logger(
x => x.Filter.ByIncludingOnly(y => y.Level == Serilog.Events.LogEventLevel.Error || y.Level == Serilog.Events.LogEventLevel.Fatal)
.WriteTo.File("logs\\error.log", rollingInterval: RollingInterval.Day))
.CreateLogger();
【讨论】:
以上是关于Serilog - 多个日志文件的主要内容,如果未能解决你的问题,请参考以下文章
Serilog Net Core 3.1 不创建任何日志文件
如何在 .Net Framework 中使用 Serilog 为每个 API 创建日志文件?