我正在尝试弄清楚根据NLog中实现的message templates syntax来捕获具有重复孔名称的属性的正确行为是什么
让我们看一个例子。
使用重复的孔名称记录到控制台,但参数数量少于名称数量。
// 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}
没有替代品!
使用相同的参数计数以重复的孔名称记录到控制台。
// 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的行为。它可以替代。
根据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}"
或数字属性名称(不推荐)。