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 static final Logger log = LoggerFactory.getLogger(ClassName.class);

использовать

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());
        }