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

时间:2019-06-13 18:23:59

标签: .net logging nlog asp.net-core-logging

我是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 Server。

1 个答案:

答案 0 :(得分:1)

如Rolf所述,当使用Microsoft Extension Logging时,解析是通过Microsoft Extension Logging完成的。 (由于性能原因,默认情况下)

Microsoft Extension Logging不支持字符串格式的消息,而仅支持结构化的消息。因此{2} {1}{0}将被解析为名称(从左到右)

记录以下内容会更合乎逻辑:

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

如果您真的很喜欢字符串格式的消息,则可以:

  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