Вопрос по java – Общий способ getLogger из log4j.Logger

14

Вместо указания имени класса для каждого класса:

log = Logger.getLogger(Foo.class);
log = Logger.getLogger(Bar.class);
log = Logger.getLogger(Test.class);

Будет ли нормально использовать:

log = Logger.getLogger(this.getClass());

Каковы будут последствия?

Ваш Ответ

7   ответов
2

Конечно, это выглядит хорошо.

Имейте в виду, что одним из следствий является то, что если у вас могут возникнуть проблемы с использованием журнала из статического контекста - он может быть не инициализирован или невидим

10

Попробуйте этот способ найти общий класс ...

private static final Log LOGGER = Logger.getLogger(MethodHandles.lookup().lookupClass());

Самое приятное, что вы можете использовать этот метод статически.

6

Если вы не хотите повторять, чтобы сделатьlogger и хотите избежать написания неправильного имени класса, там@Журнал изПроект Ломбок.

Если вы не возражаете против использования еще одной библиотеки в своем проекте, вы можете просто добавить регистратор с простой аннотацией.

import lombok.extern.java.Log;
import lombok.extern.slf4j.Slf4j;

@Log
public class LogExample {    
  public static void main(String... args) {
    log.error("Something's wrong here");
  }
}
Error: User Rate Limit Exceededprojectlombok.org/features/log.
Error: User Rate Limit Exceeded
1

+1 для экземпляров подкласса, которые вызывают супер метод, регистратор будет подклассом.

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

17

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

package pkgone;
public class SuperType {
    private Logger log = Logger.getLogger(this.getClass());
    public void someAction() {
        log.info("Doing something");
    }
}

.

package pkgtwo;
import pkgone.SuperType;
public class SubType extends SuperType {
    // for instances of SubType, the log object in SuperType
    // will get initialized with SubType's class object
}

.

// some code somewhere that uses SubType
SubType obj = new SubType();
obj.someAction();

В приведенном выше примере «Делать что-то» будет зарегистрирован в логгере pkgtwo.SubType вместо логгера pkgone.SuperType, который может или не может быть тем, что вы хотите.

Error: User Rate Limit Exceeded user648026
Error: User Rate Limit Exceededpkgone.SuperTypeError: User Rate Limit Exceeded
1

Используя фабрику журналов из Apache Commons:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;

public class SomeNewClass {
...
private final Log logger = LogFactory.getLog(this.getClass());
...
}

Не нужно больше ничего делать. Не уверен, что LogFactory был доступен во время публикации вопроса. Если вы не хотите использовать LogFactory, вы также можете просто использовать private final с getClass ().

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

Нет смысла создавать подклассы, если вы не хотите иерархии журналирования, что также можно сделать с помощью манипуляции с файлом конфигурации журнала (log4j.xml, если это то, что вы используете). Вы просто не можете использовать this.getClass (), когда регистратор определен как статический. Без статического или приватного финала вы оставляете регистратор открытым для опасных изменений, которые вам не нужны.

-1

Там нет никаких последствий, как я знаю. Я полагаю, что согласно комментарию Мэтта, это правильное поведение, которого хотят все.

Error: User Rate Limit Exceeded user648026

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