Serilog - 无法根据 属性 记录到多个文件

Serilog - can not log to multiple files based on property

您好,我正在尝试使用 Serilog.

在一个文件中记录一些消息,在另一个文件中记录其他消息

我试过以下配置:

Log.Logger = new LoggerConfiguration()
                    .WriteTo.Map("type", "audit", (name, x) => x.File(auditLogPath))
                    .WriteTo.Map("type", "normal", (nm, wt) => wt.File(logpath).WriteTo.Console())
                    .CreateLogger();

现在我期望当我 Push 一个键为 audit 的键值对到日志上下文时,我的数据将记录在第一个模式中 audit :

using(LogContext.PushProperty("type","audit")
{
    Log.Information("something");
} 

为什么我的数据会进入第二种模式?它被记录到控制台并放入另一个文件,我不明白为什么。

更新

从下面的回答中我了解到不需要定义多个记录器,而是基于 key:

进行调度
Log.Logger = new LoggerConfiguration()
                  .WriteTo.Map("type", string.Empty, (nm, wt) => {
                      if (nm == "audit") {
                        wt.File(auditLogPath);  //i want to write here !
                        return;
                      }
                      wt.File(logpath).WriteTo.Console()                                                                                
                   })
             .CreateLogger();

然而,当我尝试使用它登录第一个场景 audit 时,如下所示,所有日志都放置在另一个场景中 (logpath+ Console)

using(LogContext.PushProperty("type","audit"))
{
    Log.Information("something");
}

你误解了Map的第二个参数是什么。它不是过滤器...它只是您 keyPropertyName 的默认值,以防它不存在于日志事件中。

根据 type 属性 的值 select 接收器的决定必须由您在 Map 配置的主体中完成。

例如

Log.Logger = new LoggerConfiguration()
    .WriteTo.Map("type", string.Empty, (type, wt) =>
    {
        if (type.Equals("audit"))
        {
            wt.File(auditLogPath);
        }
        else if (type.Equals("normal"))
        {
            wt.File(logPath)
                .WriteTo.Console();
        }
    })
    .Enrich.FromLogContext()
    .CreateLogger();

另请注意,如果不通过 LogContext 启用丰富,您推送的属性将对 Map 不可见,因此您需要上面的 .Enrich.FromLogContext()