Serilog和Filters.Expressions的过滤器在appsettings.json中

5

我们希望获取以下日志:

  1. 控制台(所有日志)
  2. 文件(所有日志)
  3. 文件(仅筛选后的日志

所有这些都在appsettings.json中配置。

这是应用程序的appsettings.json文件:

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Literate", "Serilog.Sinks.File", "Serilog.Filters.Expressions" ],
    "MinimumLevel": "Verbose",
    "WriteTo": [
      {
        "Name": "LiterateConsole"
      },
      {
        "Name": "File",
        "Args": {
          "path": "%TEMP%\\Logs\\FileWithoutFilter-.log",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}",
          "rollingInterval": "Day"
        }
      },
      {
        "Name": "File",
        "Args": {
          "path": "%TEMP%\\Logs\\UPLOADERROR-.log",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
        },
        "Filter": [
          {
            "Name": "ByIncludingOnly",
            "Args": {
              "expression": "@Level = 'Error' and UploadError is not null"
            }
          }
        ]
      }
    ]
  }
}

然而,尽管Console和未经过滤的File日志记录正常运行,带有过滤器的File仍会记录所有行,就像未经过滤的文件一样。

我们在C#代码中发送了该log.error行:

Log.Error("Fichero con error {@UploadError}", true);

但是,我已经说过,所有的行都被记录到UPLOADERROR文件中。

有什么想法是appsettings.file出了什么问题吗?

谢谢。

1个回答

11

解决方案是使用Serilog的子记录器。然后,您必须使用过滤和汇聚器配置子记录器。

仔细阅读与Serilog的一般、配置和过滤器相关的文档是诀窍。

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Literate", "Serilog.Sinks.File", "Serilog.Filters.Expressions" ],
    "MinimumLevel": "Verbose",
    "WriteTo": [
      {
        "Name": "LiterateConsole"
      },
      {
        "Name": "File",
        "Args": {
          "path": "%TEMP%\\Logs\\FileWithoutFilter-.log",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}",
          "rollingInterval": "Day"
        }
      },
      {
        "Name": "Logger",
        "Args": {
          "configureLogger": {
            "Filter": [
              {
                "Name": "ByIncludingOnly",
                "Args": {
                  "expression": "@Level = 'Error' and UploadError is not null"
                }
              }
            ],
            "WriteTo": [
              {
                "Name": "File",
                "Args": {
                  "path": "%TEMP%\\Logs\\UPLOADERROR-.log",
                  "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
                }
              }
            ]
          }
        }
      }
    ]
  }
}

通过之前的配置,现在一切都正常工作。


你能展示一下在 Program.cs 中如何使用 Serilog 进行注册并使用相同的配置吗?我正在尝试实现相同的功能,但其中一个日志总是丢失。 - Rasik
抱歉,我不再有访问此项目的权限了。无论如何,我认为问题不在于Serilog依赖项注册。敬礼。 - ferpega
2
Serilog.Filters.Expressions未能安装,因为过滤器表达式无法正常工作。我已经安装了它,现在它可以正常运行了。 - Rasik
1
正如@Rasik所描述的那样,缺少的软件包对我们也是一个问题。但请注意:Serilog.Filters.Expressions现在已经被废弃了。请改用Serilog.Expressions。 - G43beli
2
在新的包(serilog.expressions)中,语法已经改变,@Level现在是@l - Menahem

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