具有重复孔名称的NLog结构化日志记录

时间:2020-05-26 06:58:00

标签: c# nlog structured-logging

我正在尝试弄清楚根据NLog中实现的message templates syntax来捕获具有重复孔名称的属性的正确行为是什么。

我们来看一个例子。

  1. 使用重复的孔名称记录到控制台,但参数数量少于名称数量。

    // Targets where to log to: File and Console
    var logconsole = new NLog.Targets.ConsoleTarget("logconsole");
    config.AddRule(global::NLog.LogLevel.Debug, global::NLog.LogLevel.Fatal, logconsole);
    // Apply config           
    NLog.LogManager.Configuration = config;
    NLog.LogManager.GetLogger("A").Info("hello from {a} {b} {a}", 1, 2); 
    

输出为

2020-05-26 09:47:37.5013 | INFO | A |您好来自{a} {b} {a}

没有任何替代!

  1. 使用重复的孔名称和相同的参数计数记录到控制台。

    // Targets where to log to: File and Console
    var logconsole = new NLog.Targets.ConsoleTarget("logconsole");
    config.AddRule(global::NLog.LogLevel.Debug, global::NLog.LogLevel.Fatal, logconsole);
    // Apply config           
    NLog.LogManager.Configuration = config;
    NLog.LogManager.GetLogger("A").Info("hello from {a} {b} {a}", 1, 2, 3); 
    

输出为

2020-05-26 09:49:53.1436 | INFO | A | hello from 1 2 3

已应用替代。

因此,我希望在第一种情况下能看到替代品,但没有。 NLog中关于message templates syntax的行为是否正确?

我已经检查了第一种情况下Serilog的行为。它会替代。

1 个答案:

答案 0 :(得分:2)

根据NLog文档,这是正确的行为-How to use structured logging声明

参数名称应该唯一

尽管messagetemplates.org捕获规则对参数没有这样的限制:

如果任何属性名称都是非数字的,则所有参数均为 通过从左到右与孔匹配的顺序捕获 他们出现了

NLog对从左到右的匹配有其自己的解释-如果属性的数量与参数的数量不匹配,则格式不被视为有效的结构化消息模板(检查ParseMessageTemplate方法)。给您两个预期的结果

Logger.Info("{User} {Value}", "Bob", 42); // "Bob" 42
Logger.Info("{User} {Value} {User}", "Bob", 42); // invalid template

这不是预期的(但NLog已警告您使用唯一属性):

Logger.Info("{User} {Value} {User}", "Bob", 42, "Joe"); // "Bob" 42 "Joe"

如果您希望在上一个示例中获得"Joe" 42 "Joe",则可以使用Serilog或在消息模板"{0} {1} {0}"中使用数字属性名称(不推荐)。

相关问题