关于c#:Filter Serilog日志取决于上下文源到不同的接收器?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于c#:Filter Serilog日志取决于上下文源到不同的接收器?相关的知识,希望对你有一定的参考价值。

我有一个.NET Core 2.0应用程序,可以在其中成功使用Serilog进行日志记录。现在,我想将一些数据库性能统计信息记录到一个单独的接收器中(它们不是用于调试的,这基本上是应用程序中所有其他记录的目的,因此我想将它们分开),并认为可以完成此操作 通过使用Log.ForContext()创建数据库统计记录器。

我不知道如何使用我的appsettings.json配置Serilog以将"调试日志"记录到一个接收器,而将数据库统计信息记录到另一个接收器?我希望可以做类似的事情:


"Serilog": {
 "WriteTo": [
    {
     "Name":"RollingFile",
     "pathFormat":"logs/Log-{Date}.log",
     "Filter": {
       "ByExcluding":"FromSource(MyClass)"
      }
    },
    {
     "Name":"RollingFile",
     "pathFormat":"logs/DBStat-{Date}.log",
     "Filter": {
         "ByIncludingOnly":"FromSource(MyClass)"
      }
    }
  ]
}

对我而言,配置的"Filter"部分纯属猜测。是否可以使用我的配置文件管理器执行此操作,还是需要在我的Startup.cs文件中的代码中执行此操作?

编辑:我已经使用C#API使它工作,但仍然想使用JSON配置来弄清楚它:


Log.Logger = new LoggerConfiguration()
            .WriteTo.Logger(lc => lc
                .Filter.ByExcluding(Matching.FromSource<MyClass>())
                .WriteTo.LiterateConsole())
            .WriteTo.Logger(lc => lc
                .Filter.ByExcluding(Matching.FromSource<MyClass>())
                .WriteTo.RollingFile("logs/DebugLog-{Date}.log"))
            .WriteTo.Logger(lc => lc
                .Filter.ByIncludingOnly(Matching.FromSource<MyClass>())
                .WriteTo.RollingFile("logs/DBStats-{Date}.log", outputTemplate:"{Message}{NewLine}"))
            .CreateLogger();

 相关讨论

我今天完成了这项工作,并认为我会提供一个正确的答案,因为我花了很多篇文章,问题和其他页面来解决问题。

拥有所有日志非常有用,但是我还想单独记录我的API代码,并省略Microsoft.命名空间日志。进行此操作的JSON配置如下所示:


 "Serilog": {
   "Using": ["Serilog.Sinks.File" ],
   "MinimumLevel":"Debug",
   "WriteTo": [
      {
       "Name":"File",
       "Args": {
         "path":"/var/logs/system.log",
          ... //other unrelated file config
        }
      },
      {
       "Name":"Logger",
       "Args": {
         "configureLogger": {
           "WriteTo": [
              {
               "Name":"File",
               "Args": {
                 "path":"/var/logs/api.log",
                  ... //other unrelated file config
                }
              }
            ],
           "Filter": [
              {
               "Name":"ByExcluding",
               "Args": {
                 "expression":"StartsWith(SourceContext, 'Microsoft.')"
                }
              }
            ]
          }
        }
      }
    ],
   "Enrich": ["FromLogContext","WithMachineName","WithThreadId" ]
    ... //Destructure and other config
  }

顶级WriteTo是第一个简单的全局接收器。所有日志事件都将写入此内容。如果在与此相同的级别上添加Filter部分,它将影响所有已配置的WriteTo元素。

然后,我将另一个WriteTo配置为Logger(不是File),但是Args看上去与此不同,并且具有一个configureLogger元素,其作用与顶层的Serilog相同,即也就是说,它是子记录器的顶层。这意味着您可以轻松地将此配置拆分为一个单独的文件,并将其另外添加到配置构建器中(请参阅底部)。

从这里开始,此子记录器的工作方式相同:您可以配置多个WriteTo,并且此级别上的Filter元素将仅影响此子记录器。

只需将更多"Name":"Logger"元素添加到顶层WriteTo部分,并分别为每个元素设置过滤器。

注意
同样重要的是要注意,即使您在config中完成所有这些操作,并且没有在代码中引用Serilog.Filters.Expressions包的任何一点,您仍然必须向该包添加NuGet引用。没有软件包参考,它将无法正常工作。

关于拆分配置:

如果必须添加更多的记录器,为了清楚起见,我一定会将不同的记录器分成单独的文件,例如

appsettings.json:


 "Serilog": {
   "Using": ["Serilog.Sinks.File" ],
   "MinimumLevel":"Error",
   "WriteTo": [
      {
       "Name":"File",
       "Args": {
         "path":"/var/logs/system.log",
          ...
        }
      },
      {
       "Name":"Logger",
       "Args": {
         "configureLogger": {} // leave this empty
        }
      }
    ],
   "Enrich": ["FromLogContext","WithMachineName","WithThreadId" ],
    ...

apilogger.json:


{
 "Serilog:WriteTo:1:Args:configureLogger": {   //notice this key
   "WriteTo": [
      {
       "Name":"File",
       "Args": {
         "path":"/var/logs/api_separateFile.log",
          ...
        }
      }
    ],
   "Filter": [
      {
       "Name":"ByExcluding",
       "Args": {
         "expression":"StartsWith(SourceContext, 'Microsoft.')"
        }
      }
    ]
  }
}

然后调整我的IWebHost构建器以包括其他配置:


    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.AddJsonFile("apilogger.json", optional: false, reloadOnChange: false);
        })
        .UseStartup<Startup>();

这样,更易于理解,阅读和维护。

以上是关于关于c#:Filter Serilog日志取决于上下文源到不同的接收器?的主要内容,如果未能解决你的问题,请参考以下文章

扩展.net日志框架Serilog的WriteTo

扩展.net日志框架Serilog的WriteTo

C# ASP.NET Core Serilog 添加类名和方法到日志

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

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

Serilog 最佳实践