不同最小级别的日志记录 Serilog

43

在Serilog中,有办法区分不同记录器的日志级别吗?我想要将MinimumLevel Debug记录到控制台输出,但只记录Warning及以上级别到文件输出。我正在使用ASP.NET Core 2.1,以下是当前的appsettings.json文件内容:

"Serilog": {
    "Using": [ "Serilog.Sinks.Console" ],
    "MinimumLevel": "Debug",
    "WriteTo": [
      {
        "Name": "RollingFile",
        "IsJson": true,
        "Args": {
          "pathFormat": "C:\\Logs\\Log-{Hour}.json",
          "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog"
        }
      },
      {
        "Name": "Console"
      }
    ]
  },

这是在“Args”下的另一个参数吗?我尝试在此位置使用“minimumnLevel”,但它没有起作用。


2
在 app.config 中如何实现这个? - PHenry
对于一个 .Net 应用程序?我没有需要这种详细/区分的 .net,只有 .net core。在添加 serilog 后,这是我添加到 .Net 配置的全部内容:<add key="serilog:using:RollingFile" value="Serilog.Sinks.RollingFile" /> <add key="serilog:write-to:RollingFile.pathFormat" value="C:\Logs\log-{Hour}.txt" /> - jollyroger23
4
我能够在 app.config 中使这个工作。关键是要确保 Serilog 真正关注此行。<add key="serilog:minimum-level" value="Debug"/>然后,我使用以下内容记录日志到文件中:<add key="serilog:write-to:RollingFile.restrictedToMinimumLevel" value="Debug"/>,并使用以下内容将其记录到控制台中:<add key="serilog:write-to:Console.restrictedToMinimumLevel" value="Information"/> 很抱歉格式有些混乱,我不确定如何在评论中进行换行。 - PHenry
感谢 @PHenry 找出了设置最低级别为调试的应用程序/网站配置设置。我一直尝试着使用 serilog:MinimumLevel:Debug 等方法,但都没有成功。 - billinkc
3个回答

47

您要寻找的设置是 restrictedToMinimumLevel。这个 GitHub 问题 展示了一些示例,但对于您的示例,您只需要将 restrictedToMinimumLevel 添加到 RollingFileArgs 中:

"Serilog": {
    "Using": [ "Serilog.Sinks.Console" ],
    "MinimumLevel": "Debug",
    "WriteTo": [
      {
        "Name": "RollingFile",
        "IsJson": true,
        "Args": {
          "pathFormat": "C:\\Logs\\Log-{Hour}.json",
          "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
          "restrictedToMinimumLevel": "Warning"
        }
      },
      {
        "Name": "Console"
      }
    ]
  },

11

根据上面的答案,这是我在代码中设置它而不是配置文件中的方法。

LoggerConfiguration GetConfig()
                => new LoggerConfiguration()
                    .WriteTo.Seq(serverUrl: "http://localhost:5341", restrictedToMinimumLevel: LogEventLevel.Debug)
                    .WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Error);
            var logger = GetConfig().CreateLogger();
            builder.RegisterInstance(logger).As<ILogger>();

在我这样做之后,它可以记录信息级别和以上的日志。但无法记录调试日志。 这篇文章 解释了原因。

我必须像这样设置一个“全局”最低级别。

LoggerConfiguration GetConfig()
            => new LoggerConfiguration()
                .WriteTo.Seq(serverUrl: "http://localhost:5341", restrictedToMinimumLevel: LogEventLevel.Debug)
                .WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Error)
                .MinimumLevel.Verbose();

8

在您的配置中,您有一个Serilog记录器,但有两个sink。其中一个是RollingFile,另一个是Console。

您可以覆盖(但仅提高)每个sink的最小日志记录级别,参数名为restrictedToMinimumLevel

由于您想将文件sink的最小日志记录级别从记录器的默认Debug提高到Warning,因此在您的appsettings.json文件中,它应该如下所示:

"Serilog": {
    "Using": [ "Serilog.Sinks.Console" ],
    "MinimumLevel": "Debug",
    "WriteTo": [
      {
        "Name": "RollingFile",
        "IsJson": true,
        "Args": {
          "pathFormat": "C:\\Logs\\Log-{Hour}.json",
          "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
          "restrictedToMinimumLevel": "Warning"
        }
      },
      {
        "Name": "Console"
      }
    ]
  },

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接