@relgames
Java Developer

Java logging: как вы объявляете log-поле в классе

Есть 2 основных способа объявить log-поле в своем классе:
private static final Logger log = LoggerFactory.getLogger(ClassName.class);

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

Я обычно использую второй способ — меньше ошибок при рефакторинге (например, классы переименовали, а log-поле забыли). Но вот задумался — может, есть какие-то недостатки такого подхода, которые я не вижу?

А какой подход используете вы?
  • Вопрос задан
  • 4673 просмотра
Решения вопроса 1
@sergei-grigorev
Использую первый способ, специально для этого в Intellij IDEA сделал макрос. Специально для того, чтобы даже если класс потом кем-то отнаследуется, лог все равно привязывался к конкретному классу и было легче найти строчку, где сообщение было сгенерировано.

private static final org.slf4j.Logger LOGGER =
org.slf4j.LoggerFactory.getLogger($CLASS_NAME$.class.getName());
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
@Lendon
Logger обьявляется для класса, соответственно нужно использовать модификатор уровня класса — static. Т.е. мне кажется первый вариант правильнее.
Для обьявления логгера использую шаблон в eclipse:
${:import(org.slf4j.Logger, org.slf4j.LoggerFactory)}
private static final Logger log = LoggerFactory.getLogger(${primary_type_name}.class);
Ответ написан
@MikeMirzayanov
Такое хорошо протягивать через DI, а объявление делать в таком стиле:

@InjectLogger
private Logger logger;
Ответ написан
Комментировать
@relgames Автор вопроса
Java Developer
Ответ написан
Комментировать
barker
@barker
Конечно, первый способ. А при рефакторинге это в какой это IDE не переименуется и в объявлении имя? Да и как его можно забыть тем более, если компилироваться перестанет? Не понимаю…
Ответ написан
png
@png
Однозначно первый для большинства случаев.
если рефакторить при помощи той же idea, которая умеет заменять название класса во всех местах, где он используется. Заменяет даже в комментариях и не java-файлах.

второй подход не верен, если не понимать разницы. Так как не рационально используются ресурсы (и память, и процессор) подумайте, вы для каждого объекта создаете его собственный объект Logger. Он будет создаваться при создании объекта, уничтожаться уничтожении основного объекта.

Оно вам надо?
Ответ написан
@mark_stein
Я тоже использую первый вариант, вот только до сих пор мучаюсь — прописывать имя переменной маленькими буквами 'log' или большими 'LOG' — по правилам константы надо большими, а так не хочется.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы