Serilog:如何在配置文件中指定过滤器表达式

时间:2017-05-17 13:14:28

标签: serilog

我正在尝试在appsettings .json文件中指定此过滤器

.Filter.ByExcluding(Matching.FromSource("Microsoft.AspNetCore.Hosting.Internal.WebHost"))

以上语法在c#

中指定时有效

但尝试在json文件中指定相同内容不起作用。

"Filter": [
{
"Name": "ByExcluding",
"Args": {
"expression": "Matching.FromSource = 'Microsoft.AspNetCore.Hosting.Internal.WebHost'"
}
}

3 个答案:

答案 0 :(得分:2)

您需要使用Serilog.Filters.Expressions

Install-Package Serilog.Filters.Expressions

appsettings.json 中的过滤器部分如下所示:

"Filter": [
  {
    "Name": "ByExcluding",
    "Args": {
      "expression": "SourceContext = 'Microsoft.AspNetCore.Hosting.Internal.WebHost'"
    }
  }
],

在这种特定情况下,我建议将level overrides作为替代方案,以便更有效地关闭特定命名空间。

答案 1 :(得分:0)

尼古拉斯·布鲁姆哈特(Nicholas Blumhardt)的回答是正确的,但是有些额外的细节可能对您有用。 如果您没有像下面这样的源代码(在serilog初始化期间)

.Filter.ByExcluding(Matching.FromSource("Microsoft.AspNetCore.Hosting.Internal.WebHost"))

在您的一个.cs文件中,则不会加载Serilog.Filters.Expressions.dll文件,并且当加载配置文件时,您的过滤器表达式将仅以静默方式失败。因此,请务必在.cs源代码中引用.Filter(即使它从未被调用)

另一项对调试serilog本身有用的项目(尤其是如本例所示的配置文件启动)是将其自身的serilog调试添加到控制台中

   // this is just to check on serilog startup and configuration, problems with serilog itself get written to console
    Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));

然后在调试模式下运行.cs应用程序,并在从其配置文件初始化serilog时在控制台上检查消息。

答案 2 :(得分:0)

使用Filter.ByInIncludeOnly仅使用“ MyWellKnownNamespace”就更容易了 这比尝试找出确切消息中不需要的消息来自哪个命名空间要容易得多:

 Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(_configuration)
                .Filter.ByIncludingOnly( Matching.FromSource("MyWellKnownNamespace") )
                .CreateLogger();