NLog заменяет параметры не по порядку при использовании стиля String.Format - PullRequest
0 голосов
/ 13 июня 2019

Я новичок в 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

Не ожидается, что NLog будет работать так же, какString.Format при использовании замены стиля String.Format?

Похоже, чтобы заменить значения в порядке, без учета числа.Я попробовал выполнить тест с "{0} {0} {0}" в качестве строки формата, но он не был зарегистрирован, что наводит меня на мысль, что он обращает некоторое внимание на значения.Это также заставляет меня поверить, что NLog не передает обработку на String.Format, потому что String.Format с радостью заменит каждый из них первым аргументом.

В случае, если это имеет значение, мы используем NLog длянаписать в SQL Server.

1 Ответ

1 голос
/ 14 июня 2019

Как упоминал Рольф, при использовании регистрации расширений Microsoft анализ выполняется с помощью регистрации расширений Microsoft.(по умолчанию из-за производительности)

В журнале расширений Microsoft нет поддержки сообщений в формате строки, а только структурированное сообщение.Так что {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. Или включить "ParseMessageTemplates" в NLogProviderOptions, см. https://github.com/NLog/NLog.Extensions.Logging/wiki/NLog-LoggerProvider-Options
...