Serilog :选择在运行时记录哪个接收器
Serilog : choose which sink to log at runtime
我将在 .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 中,您可以通过 sub-loggers using filters or via Serilog.Sinks.Map, using context properties 进行分离,以决定哪个记录器将包含或排除某些消息。
下面的示例定义了默认情况下所有日志事件都将写入控制台和文件,但是如果日志事件在日志上下文中有一个名为 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();
N.B.: 理想情况下,你会想出更好的 属性 更通用的名称,这样当你在你的应用程序中编写日志时,它不必知道任何关于“控制台”或“文件”。例如您可以有一个名为 Secret
或 Classified
的 属性,并根据是否存在此 属性 来决定将日志写入何处。
有多种方法可以为日志事件添加属性,包括在 Log.Information
时直接在消息模板中添加 属性 等,通过 LogContext.PushProperty
as in the example above, and vi Log.ForContext
.
您可以在此处查看过滤、子记录器和 Serilog.Sinks.Map 的其他示例:
- Serilog - Separate files for Information, exception using appsetting.json
我将在 .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 中,您可以通过 sub-loggers using filters or via Serilog.Sinks.Map, using context properties 进行分离,以决定哪个记录器将包含或排除某些消息。
下面的示例定义了默认情况下所有日志事件都将写入控制台和文件,但是如果日志事件在日志上下文中有一个名为 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();
N.B.: 理想情况下,你会想出更好的 属性 更通用的名称,这样当你在你的应用程序中编写日志时,它不必知道任何关于“控制台”或“文件”。例如您可以有一个名为 Secret
或 Classified
的 属性,并根据是否存在此 属性 来决定将日志写入何处。
有多种方法可以为日志事件添加属性,包括在 Log.Information
时直接在消息模板中添加 属性 等,通过 LogContext.PushProperty
as in the example above, and vi Log.ForContext
.
您可以在此处查看过滤、子记录器和 Serilog.Sinks.Map 的其他示例:
- Serilog - Separate files for Information, exception using appsetting.json