Почему регистраторы рекомендуют использовать регистратор в классе?

Согласно документации NLOG:

Большинство приложений будет использовать один регистратор в классе, где название регистратора совпадает с названием класса.

Это - тот же способ, которым работает log4net. Почему это - хорошая практика?

86
задан Daniel T. 29 June 2010 в 19:12
поделиться

6 ответов

С log4net использование одного логгера на класс позволяет легко определить источник сообщения журнала (т.е. класс, пишущий в журнал). Если у вас нет одного логгера на класс, а вместо этого есть один логгер для всего приложения, вам придется прибегнуть к большим уловкам отражения, чтобы узнать, откуда приходят сообщения журнала.

Сравните следующие варианты:

Логгер на класс

using System.Reflection;
private static readonly ILog _logger = 
    LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);    

public void SomeMethod()
{
    _logger.DebugFormat("File not found: {0}", _filename);
}

Один логгер на приложение (или аналогичный)

Logger.DebugFormat("File not found: {0}", _filename); // Logger determines caller

-- or --

Logger.DebugFormat(this, "File not found: {0}", _filename); // Pass in the caller

Если использовать второй пример, то логгеру придется строить трассировку стека, чтобы узнать, кто его вызывает, или ваш код всегда должен будет передавать вызывающую сторону. Используя стиль logger-per-class, вы все еще делаете это, но можете делать это один раз на класс, а не один раз на вызов и устранить серьезную проблему производительности.

57
ответ дан 24 November 2019 в 08:07
поделиться

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

Хорошим примером, когда такой подход не является лучшим, являются журналы SQL в Hibernate. Существует общий логгер под названием "Hibernate.SQL" или что-то в этом роде, где несколько различных классов записывают необработанный SQL в одну категорию логгеров.

3
ответ дан 24 November 2019 в 08:07
поделиться

​​Вероятно, потому что вы хотите иметь возможность регистрировать методы, которые видны только классу, без нарушения инкапсуляции, это также упрощает использование класса в другом приложении без нарушения функциональности ведения журнала.

0
ответ дан 24 November 2019 в 08:07
поделиться

Упрощает настройку приложений по пространству имен или классу.

0
ответ дан 24 November 2019 в 08:07
поделиться

Я вижу несколько причин для этого выбора.

  • Вы всегда будете знать, откуда пришел конкретный оператор журнала, если включите имя регистратора в формат вывода журнала.
  • Вы можете контролировать, какие операторы журнала вы видите на детальном уровне, включив или отключив определенные средства ведения журнала или установив их уровень.
5
ответ дан 24 November 2019 в 08:07
поделиться

Сразу приходят на ум две причины:

  1. Наличие отдельного журнала для каждого класса позволяет легко группировать вместе все сообщения журнала / ошибки, относящиеся к данному классу.
  2. Наличие журнала внутри класса позволяет вам регистрировать внутренние детали, которые могут быть недоступны за пределами класса (например, частное состояние, информация, касающаяся реализации класса и т. Д.).
1
ответ дан 24 November 2019 в 08:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: