Serilog :选择在运行时记录哪个接收器

Kur*_*nts 12 c# sink serilog .net-standard

我将在 .net 标准 2.0 库中实现 Serilog。我正在寻找一种方法来选择每个日志行应使用哪个接收器。

假设我们在配置中定义了 2 个接收器(控制台和文件):

    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Debug()
        .WriteTo.Console()
        .WriteTo.File("c:\\temp\\SerilogTets.txt")
        .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

之后,我们将编写一条日志规则:

Log.Information("Hello, world!");  //<- how can we define which sink we want to use
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来定义应记录哪些接收器的这些行:

  • 控制台和文件
  • 仅控制台
  • 仅文件

不依赖于它是什么日志级别。

先感谢您!

亲切的问候,库尔特

Cai*_*ete 15

在 Serilog 中,您可以通过使用过滤器的子记录器或通过Serilog.Sinks.Map进行这种分离,使用上下文属性来决定哪个记录器将包含或排除某些消息。

下面的示例定义默认情况下所有日志事件都将写入控制台和文件,但是如果日志事件具有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();
Run Code Online (Sandbox Code Playgroud)

注意:理想情况下,您会想出更好、更通用的属性名称,这样当您在应用程序中写入日志时,就不必知道有关“控制台”或“文件”的任何信息。Secret例如,您可以有一个名为or 的属性Classified,并根据该属性是否存在来决定将日志写入何处。

向日志事件添加属性有多种方法,包括直接在消息模板中添加属性Log.Information等,LogContext.PushProperty如上例所示,以及 vi Log.ForContext

您可以在此处查看过滤、子记录器和 Serilog.Sinks.Map 的其他示例: