C# 具有重复井眼名称的NLog结构化测井
我正试图找出在NLog中实现的使用重复孔名称捕获属性的正确行为 让我们看一个例子C# 具有重复井眼名称的NLog结构化测井,c#,nlog,structured-logging,C#,Nlog,Structured Logging,我正试图找出在NLog中实现的使用重复孔名称捕获属性的正确行为 让我们看一个例子 使用重复的孔名称记录到控制台,但参数计数小于名称计数 // 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, l
// 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);
// 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);
我已经检查了Serilog第一个案例中的行为。它进行替换。根据NLog文档-状态,这是正确的行为 参数的名称应该是唯一的 虽然在捕获规则时,不要对参数设置这样的限制: 如果任何属性名称是非数字的,则所有参数都是非数字的 通过按以下顺序从左到右匹配孔来捕获: 它们出现了 NLog对从左到右匹配有自己的解释-如果属性计数与参数数量不匹配,则格式不被视为有效的结构化消息模板(检查方法)。这给了你两个预期的结果
Logger.Info("{User} {Value}", "Bob", 42); // "Bob" 42
Logger.Info("{User} {Value} {User}", "Bob", 42); // invalid template
一个是不期望的(但NLog已警告您使用唯一属性):
如果您希望在最后一个示例中获得
“Joe”42“Joe”
,那么您可以在消息模板“{0}{1}{0}”
(不推荐)。为什么认为这是正确的信息(“来自{a}{b}{a}的你好”,1,2)代码>是否有效?一些NLog指南可能会对@PavelAnikhouski有所帮助,我不知道,在我看来这是合乎逻辑的。a=1,b=2。替代应该占据一席之地。现在我已经检查了serilog提供程序的行为,它在这种情况下进行替换。现在,NLog的这种行为对我们来说似乎更加奇怪me@AlexceiShmakov好奇您为什么对使用无效的消息模板感兴趣?在什么情况下这有用?相信Microsoft ILogger(MEL)在给定无效的占位符数时抛出异常。@RolfKristensen,很难说它在哪种情况下有用。我只是在我的应用程序中实现一个结构化日志层,并考虑了不同的情况。偶然发现了这个案子。我很感兴趣,因为这种行为看起来不合逻辑。所以,我决定问。如果我不明白的话,我只是想找出答案。在这种情况下,如果NLog抛出异常也比沉默要好。谢谢你,Sergey。现在我知道了NLog的这种架构限制。@Alexeishmakov认为NLog做出的唯一架构决定是,当给出无效的输入时,不要在脸上爆炸。并专注于为有效的消息模板提供最佳性能,避免为处理无效消息模板引入开销(避免为扫描正确的占位符值带来任何开销)@RolfKristensen,我理解为什么会这样做。我对此没有任何抱怨。我完全同意你的观点,表现更重要。但现在我知道了这个案例。@RolfKristensen但我必须注意,我进行了基准测试并将NLog与Serilog进行了比较,Serilog处理了这个案例,正如我所提到的。同时,编写结构化日志的两个日志提供程序的性能都很好comparable@AlexceiShmakov总是对基准感兴趣。它是您可以在github上共享的基准吗?
Logger.Info("{User} {Value} {User}", "Bob", 42, "Joe"); // "Bob" 42 "Joe"