Структурированный каротаж NLog с повторяющимися именами отверстий - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь понять, что является правильным поведением для захвата свойств с повторяющимися именами отверстий в соответствии с синтаксисом шаблонов сообщений , который реализован в NLog.

Давайте рассмотрим пример .

  1. Запись на консоль с повторяющимися именами отверстий, но количество параметров меньше, чем количество имен.

    // Targets where to log to: File and Console
    var logconsole = new NLog.Targets.ConsoleTarget("logconsole");
    config.AddRule(global::NLog.LogLevel.Debug, global::NLog.LogLevel.Fatal, logconsole);
    // Apply config           
    NLog.LogManager.Configuration = config;
    NLog.LogManager.GetLogger("A").Info("hello from {a} {b} {a}", 1, 2); 
    

Результат:

2020-05-26 09: 47: 37.5013 | ИНФОРМАЦИЯ | A | привет от {a} {b} {a}

Замены нет!

Запись на консоль с повторяющимися именами отверстий с одинаковым количеством параметров.

// Targets where to log to: File and Console
var logconsole = new NLog.Targets.ConsoleTarget("logconsole");
config.AddRule(global::NLog.LogLevel.Debug, global::NLog.LogLevel.Fatal, logconsole);
// Apply config           
NLog.LogManager.Configuration = config;
NLog.LogManager.GetLogger("A").Info("hello from {a} {b} {a}", 1, 2, 3); 

Результат:

2020-05 -26 09: 49: 53.1436 | ИНФОРМАЦИЯ | A | привет от 1 2 3

Были применены замены.

Итак, я ожидаю увидеть замены в первом случае, но здесь нет. Это правильное поведение в NLog относительно синтаксиса шаблонов сообщений ?

Я проверил поведение в первом случае для Serilog. Делает замены.

1 Ответ

2 голосов
/ 26 мая 2020

Это правильное поведение согласно документации NLog - Как использовать структурированное ведение журнала состояния

Имена параметров должны быть уникальными

Хотя Правила захвата на messagetemplates.org не накладывают такое ограничение на параметры:

Если какое-либо из имен свойств не является числовым c , то все аргументы захватываются путем сопоставления слева направо с отверстиями в том порядке, в котором они появляются

NLog имеет свою собственную интерпретацию сопоставления слева направо - если количество свойств соответствует не соответствует количеству аргументов, то формат не считается допустимым шаблоном структурированного сообщения (проверьте метод ParseMessageTemplate ). Это дает вам два ожидаемых результата

Logger.Info("{User} {Value}", "Bob", 42); // "Bob" 42
Logger.Info("{User} {Value} {User}", "Bob", 42); // invalid template

И один неожиданный (но NLog предупредил вас об использовании уникальных свойств):

Logger.Info("{User} {Value} {User}", "Bob", 42, "Joe"); // "Bob" 42 "Joe"

Если вы ожидаете получить "Joe" 42 "Joe" на В последнем примере вы можете использовать Serilog или использовать числовые c имена свойств в шаблоне сообщения "{0} {1} {0}" (не рекомендуется).

...