Есть ли причина использовать частные вместо закрытых конечных статических значений в LogBack Logger?

При создании экземпляра Logger в контроллере Spring есть ли причина объявлять его как статический финал ? Регистратор не используется вне MyController.class. Я видел оба примера в использовании, но не понимаю, почему я должен использовать тот или другой.

private Logger logger = LoggerFactory.getLogger(MyController.class);

vs

private static final Logger logger = LoggerFactory.getLogger(MyController.class);
24
задан Tommy 24 November 2011 в 21:38
поделиться

2 ответа

Лично я использую

private final Logger logger = LoggerFactory.getLogger(this.getClass());

Основным преимуществом этого является то, что я могу вырезать и вставлять это в новые классы без необходимости менять имя класса.

Относительно того, должны ли они быть статическими, см. Должны ли члены Logger класса быть объявлены как статические? , с сайта slf4j, где написано:

Мы привыкли к Рекомендовать, чтобы члены регистраторов объявлялись как переменные экземпляра вместо статических. После дальнейшего анализа мы больше не рекомендуем один подход над другим.

Взято с этой страницы:

Преимущества объявления логгеров как статических

  1. распространенная и устоявшаяся идиома
  2. меньше нагрузка на ЦП: регистраторы извлекаются и назначаются только один раз при инициализации хост-класса
  3. меньше накладных расходов памяти: объявление логгера будет использовать одну ссылку на класс

Недостатки объявления логгеров как статических

  1. Для библиотеки, совместно используемые приложениями, невозможно использовать селекторы репозитория. Следует отметить, что если привязка SLF4J и базовый API поставляются с каждым приложением (не совместно используемым приложениями), то у каждого приложения все равно будет своя собственная среда ведения журналов.
  2. не подходит для МОК

Преимущества объявления регистраторов в качестве переменных экземпляра

  1. Можно использовать преимущества селекторов репозитория даже для библиотек, совместно используемых приложениями. Однако селекторы репозитория работают только в том случае, если базовая система ведения журналов является logback-classic. Селекторы репозитория не работают для комбинации SLF4J + log4j.
  2. IOC-friendly

Недостатки объявления регистраторов в качестве переменных экземпляра

  1. Менее распространенный идиом, чем объявление регистраторов в качестве статических переменных
  2. более высокая загрузка ЦП: регистраторы извлекаются и назначаются для каждого экземпляра класса хостинга
  3. более высокая нагрузка на память: объявление логгера будет использовать одну ссылку на экземпляр класса хостинга

Объяснение

Члены статического регистратора стоят одну ссылку на переменную для всех экземпляров класса, тогда как член регистратора экземпляров будет стоить ссылку на переменную для каждого экземпляра класса. Для простых классов, создаваемых тысячи раз, может быть заметная разница.

Однако более поздние системы ведения журнала, например, log4j или logback, поддерживают отдельный контекст средства ведения журнала для каждого приложения, работающего на сервере приложений. Таким образом, даже если на сервере развернута одна копия log4j.jar или logback-classic.jar, система ведения журналов сможет различать приложения и предлагать отдельную среду ведения журналов для каждого приложения.

Более конкретно, каждый раз, когда регистратор извлекается путем вызова метода LoggerFactory.getLogger (), базовая система журналирования возвращает экземпляр, подходящий для текущего приложения. Обратите внимание, что в том же приложении, получающем регистратор по заданному имени, всегда будет возвращаться один и тот же регистратор. Для данного имени другой регистратор будет возвращен только для разных приложений.

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

Подробнее см. На этой странице.

43
ответ дан 28 November 2019 в 23:30
поделиться

Да; так что для класса есть только один регистратор, а не один на экземпляр.

В любом случае, это приватно, поэтому использование его вне класса не имеет к этому никакого отношения - это не то, что static final делает.

1
ответ дан 28 November 2019 в 23:30
поделиться
Другие вопросы по тегам:

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