LoggerFactory.getLogger (имя класса.класса) против LoggerFactory.getLogger(это.getClass().метод getname())
Я пытаюсь улучшить свои навыки оптимизации на Java. Чтобы достичь этого, у меня есть старая программа, которую я сделал, и я изо всех сил стараюсь сделать ее лучше. В этой программе я использую SL4J для ведения журнала. Чтобы получить лесоруб, я сделал:
private static final Logger logger = LoggerFactory.getLogger(this.getClass().getName());
в свое время я писал код, я думал, что это был лучший вариант, потому что я удалить ссылку на имя класса(который может быть переработан). Но теперь я уже не так уверен...
private static final Logger logger = LoggerFactory.getLogger(ClassName.class);
на другой стороне, держит ссылка на имя класса, но он удаляет один вызов метода. Это может не быть большим улучшением производительности для одного класса, но когда у вас много класса, это может быть что-то.
Итак, мой вопрос:
какой подход лучше? Использование имени класса или получение его через отражение?
пожалуйста, мотивируйте свой ответ " за " и "против". Спасибо.
7 ответов
я поделюсь своим мнением здесь. Я бы сказал, что это тот случай, когда вы не должны беспокоиться с точки зрения производительности. Вероятно, в коде есть части, которые можно оптимизировать гораздо больше, чем эта вещь:)
теперь, относительно вашего вопроса. Взгляните на LoggerFactory это код
отметим, что getLogger(Class<?> name)
просто вызывает перегруженный метод:
Logger logger = getLogger(clazz.getName());
и делает некоторые дополнительные расчеты. Поэтому способ с строку очевидно, немного быстрее.
в общем случае шаблон должен поддерживать ссылку регистратора как статическое поле в классе, что-то вроде этого:
public class SomeClass {
private static final Logger LOG = LoggerFactory.getLogger(SomeClass.class);
}
в этом случае вы не можете использовать this.getClass()
, потому что this
фактически не существует (вы работаете в статическом контексте).
из моего опыта лучше использовать ClassName.getClass()
в качестве параметра, если вы действительно не хотите использовать один и тот же регистратор из разных классов. В таком случае вам лучше использовать некоторые логическая константа, обозначающая регистратор.
например, предположим, вы пытаетесь использовать 3 разных класса для доступа к базе данных. Таким образом, вы создаете logger 'DB', назначаете файл appender, который будет записывать в базу данных.войдите, и вы хотите повторно использовать один и тот же регистратор среди этих 3 разных классов.
так что вы должны использовать следующий код:
public class SomeClass {
private static final Logger LOG = LoggerFactory.getLogger("DB");
}
надеюсь, что это помогает
что я обычно делаю это
private static final Logger logger = LoggerFactory.getLogger(ClassName.class);
однако, идиома
protected final Logger log = LoggerFactory.getLogger(getClass());
одинаково распространено. в этом вопросе вы можете найти более подробную информацию о этих конвенций.
предпочитаю
Logger logger = LoggerFactory.getLogger(ClassName.class);
, потому что
this.getClass()
может быть переопределен одним из дочерних классов, и вы увидите имя дочернего класса в журнале. Иногда это может быть запутанным, потому что журнал фактически выполняется в родительском классе
Если вы не хотите писать имя класса каждый раз, когда вы объявляете регистратор, вы можете использовать следующий метод утилит:
public static org.slf4j.Logger getLogger() {
final Throwable t = new Throwable();
t.fillInStackTrace();
return LoggerFactory.getLogger(t.getStackTrace()[1].getClassName());
}
метод может быть использован таким образом:
private static final Logger LOG = TheClassContainingTheMethod.getLogger();
при таком подходе объявление регистратора всегда одинаково для всех классов.
поздний вход!
поскольку я, вероятно, буду искать это в будущем.
есть способ создать экземпляры дружественного регистратора копирования / вставки (при условии, что это почти никогда не является хорошей причиной что-то делать!) с помощью класса MethodHandles Java 7.
private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
использовать
private final Logger logger = LoggerFactory.getLogger(this.getClass());
}
// logic
try
{
// todo
}
catch (NullPointerException e) {
logger.error("Error:-" + e.getMessage());
return ResponseUtil.errorResponse(e.getMessage());
}
catch (Exception e) {
logger.error("Error:-" + e.getMessage());
return ResponseUtil.errorResponse(e.getMessage());
}