NLog заменяет параметры не по порядку при использовании стиля String.Format

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

Решение

Как упоминал Рольф, при использовании регистрации расширений 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
Другие вопросы по тегам