NLog 在使用 String.Format 样式时乱序替换参数

NLog replaces parameters out of order when using String.Format style

我是 NLog 的新手,有一些令人困惑的输出,所以我 运行 进行了测试。

_logger.LogInformation(string.Format("{2} {1} {0}", "broken", "nlog", "is"));
_logger.LogInformation("{2} {1} {0}", "broken", "nlog", "is");

结果是:

is nlog broken
broken nlog is

在使用 String.Format 样式替换时,NLog 不会像 String.Format 那样工作吗?

似乎是按顺序替换值,而不考虑数量。我确实尝试过使用 "{0} {0} {0}" 作为格式字符串进行测试,但它没有被记录下来,这让我相信它确实对这些值给予了一定程度的关注。这也让我相信 NLog 不会将处理传递给 String.Format 因为 String.Format 会很乐意用第一个参数替换每个参数。

以防万一,我们正在使用 NLog 写入 SQL 服务器。

正如 Rolf 提到的,当使用 Microsoft Extension Logging 时,解析是由 Microsoft Extension Logging 完成的。 (默认情况下,因为性能)

Microsoft 扩展日志记录不支持 string-formatted 消息,只支持结构化消息。所以 {2} {1}{0} 将被解析为名称(从左到右)

记录这个更合乎逻辑:

_logger.LogInformation("User {User} orders {OrderId}", username, order.Id);

如果您真的喜欢 string-formatted 条消息,那么您可以这样做:

  1. 直接使用NLog,

    var logger = LogManager.GetCurrentClassLogger();
    logger.Info("User {1} orders {0}", order.Id, username);
    
  2. 或者,在 NLogProviderOptions 中启用 "ParseMessageTemplates",参见 https://github.com/NLog/NLog.Extensions.Logging/wiki/NLog-LoggerProvider-Options