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 不会将日志写入文件

Serilog 异步 CPU 使用率高达 100%

Serilog Net Core 3.1 不创建任何日志文件

如何在 .Net Framework 中使用 Serilog 为每个 API 创建日志文件?

使用Serilog将程序结束时创建的日志文件通过电子邮件发送出去

Serilog 日志框架如何自动删除超过 N 天的日志 ?