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

Общий способ getLogger от log4j.Logger

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

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

Можно ли использовать:

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

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

4b9b3361

Ответ 1

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

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 class object
}

.

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

В приведенном выше примере "Doing something" будет регистрироваться в регистраторе pkgtwo.SubType вместо регистратора pkgone.SuperType, который может быть или не быть тем, что вы хотите.

Ответ 2

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

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

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

@Log
public class LogExample {    
  public static void main(String... args) {
    log.error("Something wrong here");
  }
}

Ответ 3

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

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

Лучше всего использовать этот метод статически.

Ответ 4

Конечно, это кажется прекрасным.

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

Ответ 5

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

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

Ответ 6

Использование журнала factory из общих ресурсов Apache:

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, вы также можете просто использовать закрытый финал с getClass().

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

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

Ответ 7

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