Log4J - есть ли смысл явно указывать имя класса в вызове LogManager.getLogger ()? - PullRequest
2 голосов
/ 19 февраля 2009

Я работаю над устаревшим кодом с большим количеством кода, например

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

Мне интересно, есть ли какое-либо преимущество в наборе "ThisClassName.class", а не

LogManager.getLogger(getClass());

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

Ответы [ 5 ]

11 голосов
/ 19 февраля 2009

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

6 голосов
/ 19 февраля 2009

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

2 голосов
/ 19 февраля 2009

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

1 голос
/ 19 февраля 2009

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

Если вы хотите, чтобы во время выполнения выводился правильный класс, и вы используете хотя бы 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 );
1 голос
/ 19 февраля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...