Подтвердить что ты не робот

Какие накладные расходы на создание логгеров SLF4J в статических или нестатических контекстах?

Я всегда использовал следующий шаблон для создания (SLF4J) регистраторов:

private static final Logger log = LoggerFactory.getLogger(MyClass.class);

Это сработало до сих пор, но в какой-то момент меня интересовало контекст static и необходимость проходить в конкретном литерале класса все время вместо того, чтобы просто использовать нестатический регистратор, например

private final Logger log = LoggerFactory.getLogger(getClass());

Об этом в основном спрашивали (и отвечали) перед этим для LOG4J

Должен ли журнал быть приватным статическим или нет

и здесь

Должен ли журнал всегда конечным и статическим?

Я понимаю, что final в основном является обязательным, поэтому мне остается недоумевать, насколько высоки накладные расходы на использование SLF4J в нестационарном контексте.

В:

Есть ли существенные практические служебные данные при использовании

private final Logger log = LoggerFactory.getLogger(getClass());

над

private static final Logger log = LoggerFactory.getLogger(MyClass.class);

в среднем (веб-приложении)? (нет необходимости "обсуждать" высокопроизводительные веб-приложения с большой нагрузкой)


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

@Inject private final Logger log;

как описано здесь http://www.seamframework.org/Weld/PortableExtensionsPackage#H-TtLoggerttInjection, но мне нужно сначала узнать о кэшировании регистратора.

Суб-вопрос: можно ли даже использовать?:

@Inject private static final Logger log;

(только начиная с CDI, если честно)

4b9b3361

Ответ 1

Накладные расходы для нестатических переменных (экземпляров) регистратора должны быть незначительными, если не существует много, скажем, 10000 или более экземпляров. Ключевое слово здесь ничтожно. Если создается много объектов ( > 10000), воздействие, вероятно, будет измеримым, но все равно будет низким.

В частности, регистратор экземпляра увеличивает объем памяти по одной ссылке (64 бита) на экземпляр объекта. На стороне процессора стоимость одного хэш-поиска на один экземпляр, т.е. Стоимость поиска соответствующего регистратора в хэш-таблице (малая). Опять же, обе затраты должны быть незначительными, если не создано много многих объектов.

Этот вопрос также обсуждается в часто задаваемых вопросах SLF4J.

Ответ 2

Я не уверен насчет точных накладных расходов при использовании LoggerFactory, но я сомневаюсь, что это повлияет на производительность вашего приложения. Поэтому просто используйте статические или нестатические по своему усмотрению.

Каким должно быть преимущество использования @Inject. LoggerFactory уже обеспечивает и абстрагируется от конкретного имплантата. В любом случае это будет намного медленнее, чем LoggerFactory.

Синтаксис более краткий, когда вы используете @Inject, который является истинным. Но представьте, что вы используете класс в тесте. Затем вам нужно настроить инъекцию, чтобы получить регистрацию. С обычным LoggerFactory он также хорошо работает в тестах. Если у java был общий механизм для @Inject, он работал бы отлично, но поскольку это сложнее, настройка сложнее.