Serilog - 无法基于属性记录到多个文件

4

你好,我试图使用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();

现在,我期望当我使用键为audit的键值对将数据Push到日志上下文时,我的数据将被记录在第一个模式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");
}
1个回答

5

你误解了Map的第二个参数。它不是一个过滤器... 它只是一个默认值,用于keyPropertyName在日志事件中不存在的情况。

基于type属性的值选择下沉处理器的决策必须在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()

所以你的意思是我不需要两次使用 Map?基本上当我有多个需要匹配的 key 时,我应该使用多个 Map - Bercovici Adrian
@BercoviciAdrian 正确 - C. Augusto Proiete
所以我使用了您提供的配置,但是委托中的 type 从未变成 audit,即使我在写入日志时使用了 LogContext.PushProperty("type","audit")。它们都被放置在 logPath 中。 - Bercovici Adrian
你忘记添加.Enrich.FromLogContext()了...请阅读我回答中的最后一句话。 - C. Augusto Proiete

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接