2009-02-18 1 views
2

Я работаю над некоторым унаследованным кодом с большим количеством коды, какLog4J - Есть ли какая-либо точка в явном указании имени класса в вызове LogManager.getLogger()?

private final Logger logger = LogManager.getLogger(ThisClassName.class); 

Я интересно, если есть какие-либо преимущества печатали «ThisClassName.class», в отличие от

LogManager.getLogger(getClass()); 

Насколько я могу судить, их нет, но мне интересно, есть ли какие-либо негативные последствия для использования getClass(). Благодарю.

ответ

11

Если вы делаете Loggerstatic, вы не можете использовать getClass().

2

getClass() не работает из статического контекста. ThisClassName.class работает для статических переменных и экземпляров.

6

Кроме того, getClass() будет скрывать фактический класс, если есть подкласс, который фактически вызывает метод. Например, предположим, что в классе A метод X вы вызываете log.debug(), а класс B расширяет класс A, переписывая метод X, но вызывающий super.X в какой-то момент. Файл журнала будет показывать класс B, а не класс А.

+0

Действительно? Регистратор является окончательным, и класс передается ему при инициализации, поэтому я не понимаю, почему это имеет значение. –

+0

(Не обязательно сказать, что вы ошибаетесь, просто сказал, что, может быть, вам стоит дважды проверить. У меня нет log4j, поэтому я не могу его протестировать.) –

+0

Я считаю, что я лично сталкивался с этим до , Это было какое-то время, потому что после этого я отказался от этой конкретной практики. –

1

я обычно использовать версию getClass() с экземпляром-переменной Logger (вы не создания другой экземпляр регистратора, просто глядя один вверх).

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

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

1

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

Если вы хотите, чтобы правильный класс выводился во время выполнения, и вы используете хотя бы Java 5, посмотрите на log5j, который обертывает log4j в API Java 5.

Это позволяет писать такие вещи, как:

private static final Logger log = Logger.getLogger(); 

и даже:

log.debug("This thing broke: %s due to bar: %s on this thing: %s", foo, bar, car); 
+0

Хм, я думал, что им придется делать что-то смешное с помощью дженериков, чтобы позволить «Logger.getLogger();». Оказывается, они делают именно то, что я реализовал для менеджера журналов моего собственного проекта: создайте исключение и прочитайте трассировку стека. Тем не менее, это заставляет меня чувствовать, что я делаю что-то юридическое. :) –

Смежные вопросы