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);
Если вам действительно нравятся сообщения в строковом формате, то вы можете сделать:
Используйте NLog напрямую,
var logger = LogManager.GetCurrentClassLogger(); logger.Info("User {1} orders {0}", order.Id, username);
- Или включите "ParseMessageTemplates" в NLogProviderOptions, см. https://github.com/NLog/NLog.Extensions.Logging/wiki/NLog-LoggerProvider-Options