我有一个.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>(); |
这样,更易于理解,阅读和维护。