Почему ILogger не может использовать одну и ту же позицию массива arguments несколько раз? - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь отследить / записать некоторую информацию о процессе отправки сообщений, над которым я работаю.

Когда вы пытаетесь использовать объект конкретной позиции из массива аргументов более одного раза, это вызывает исключение.

    private void LogRandomInfo(ILogger Log, string processName, string messageType)
    {
        try
        {
            Log.LogInformation("{0} : The event {0} has received the info {1}", processName, messageType);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

Я ожидал чего-то похожего, как когда мы используем string.Formatstring.Format вы можете печатать столько раз, сколько запрошено значение.

Поэтому string.Format("{0} {0} {0}", 1); будет печатать 1 1 1, но Log.LogInformation("{0} {0} {0}", 1); выдаст исключение типа Index за пределами границ массива.

Есть ли какое-нибудь простое объяснение, почему это происходит?

Использовалась библиотека журналирования Microsoft.Extensions.Logging

1 Ответ

2 голосов
/ 23 мая 2019

Похоже, вы используете Microsoft.Extensions.Logging?

Microsoft.Extensions.Logging использует структурированное ведение журнала. Это означает, что заполнители не являются числами, которые относятся к различным переданным аргументам, а являются именами, которые связаны с каждым из аргументов.

С Документы :

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

_logger.LogInformation(LoggingEvents.GetItem, "Getting item {ID}", id);

...

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

string p1 = "parm1";
string p2 = "parm2";
_logger.LogInformation("Parameter values: {p2}, {p1}", p1, p2);

Инфраструктура ведения журнала работает таким образом, что поставщики ведения журнала могут реализовать семантическое ведение журнала, также известное как структурированное ведение журнала . Сами аргументы передаются в систему регистрации, а не только в форматированный шаблон сообщения. Эта информация позволяет поставщикам журналов сохранять значения параметров в виде полей. Например, предположим, что вызовы метода logger выглядят так:

_logger.LogInformation("Getting item {ID} at {RequestTime}", id, DateTime.Now);

Если вы отправляете журналы в хранилище таблиц Azure, каждая сущность таблицы Azure может иметь свойства ID и RequestTime, что упрощает запросы к данным журнала. Запрос может найти все журналы в пределах определенного диапазона RequestTime без разбора времени из текстового сообщения.

...