【问题标题】:Serilog - multiple log filesSerilog - 多个日志文件
【发布时间】: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)

标签: c# logging serilog


【解决方案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();

【讨论】:

【解决方案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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多