c# - 具有重复孔名的 NLog 结构化日志记录
问题描述
我试图弄清楚根据在 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, 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|你好,来自 1 2 3
换人适用。
所以,我预计在第一种情况下会看到替换,但没有。NLog 中关于消息模板语法的行为是否正确?
我已经检查了 Serilog 在第一种情况下的行为。它做替换。
解决方案
根据 NLog 文档,这是正确的行为 -如何使用结构化日志记录状态
参数的名称应该是唯一的
尽管messagetemplates.org上的Capturing Rules没有对参数进行这样的限制:
如果任何属性名称是非数字的,则所有参数都通过从左到右与孔按照它们出现的顺序匹配来捕获
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}"
(不推荐)。
推荐阅读
- vue.js - 如果路由具有使用 VueJS 路由器的参数,如何加载不同的组件
- javascript - 为什么这个 AJAX 调用没有正确执行?
- video - 如何在页面刷新时停止 boostrap 模态视频自动播放
- sql-server - SQL Geography.STContains 返回错误值
- css - 全高弯曲的角材料垫抽屉,内容自动溢出
- r - R - doc_parse_file 中的错误
- python - 通过python读取其中一列作为超链接的Excel文件
- php - JSON 多维数组未在 PHP 上显示
- python - 如何在 Scrapy 项目中使用 PyMongo 插入新记录 MongoDB 时删除重复项
- android - 使用 tasker 或 shell 设置数据限制/数据警告