我将在 .net 标准 2.0 库中实现 Serilog。
我正在寻找一种方法来选择每个日志行应使用哪个接收器。
假设我们在配置中定义了 2 个接收器(控制台和文件):
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console()
.WriteTo.File("c:\\temp\\SerilogTets.txt")
.CreateLogger();
之后,我们将编写一条日志规则:
Log.Information("Hello, world!"); //<- how can we define which sink we want to use
我正在寻找一种方法来定义应记录哪些接收器的这些行:
不依赖于它是什么日志级别。
先感谢您!
亲切的问候,
库尔特
在 Serilog 中,您可以通过以下方式进行分离子记录器 using filters or via Serilog.Sinks.Map, using 上下文属性决定哪个记录器将包含或排除某些消息。
下面的示例定义默认情况下所有日志事件都将写入控制台和文件,但是如果日志事件具有名为FileOnly
在日志上下文中,它不会被写入控制台,同样,如果日志事件具有名为的属性ConsoleOnly
,它不会被写入文件。
using Serilog;
using Serilog.Context;
using Serilog.Filters;
// ...
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.Enrich.FromLogContext()
.WriteTo.Logger(c =>
c.Filter.ByExcluding(Matching.WithProperty("FileOnly"))
.WriteTo.Console())
.WriteTo.Logger(c =>
c.Filter.ByExcluding(Matching.WithProperty("ConsoleOnly"))
.WriteTo.File("C:\\Temp\\SerilogTests.txt"))
.CreateLogger();
// Writes to both Console & File
Log.Information("Hello, world! (Console and File)");
using (LogContext.PushProperty("ConsoleOnly", value: true))
{
// Writes only to the Console
Log.Information("Hello, world! (Console)");
}
using (LogContext.PushProperty("FileOnly", value: true))
{
// Writes only to the File
Log.Information("Hello, world! (File Only)");
}
Log.CloseAndFlush();
注意:理想情况下,您会想出更好、更通用的属性名称,这样当您在应用程序中写入日志时,就不必知道有关“控制台”或“文件”的任何信息。例如你可以拥有一个名为Secret
or Classified
并根据此属性是否存在来决定将日志写入何处。
向日志事件添加属性有多种方法,包括在您添加属性时直接在消息模板中添加属性。Log.Information
等,通过LogContext.PushProperty如上例所示,并且 viLog.ForContext.
您可以在此处查看过滤、子记录器和 Serilog.Sinks.Map 的其他示例:
- Serilog:如何不记录某些请求(或以不同级别记录)
- Serilog - 单独的信息文件,使用 appsetting.json 的例外
- Serilog 破坏多个日志?
- 按方法名称过滤 Serilog
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)