Как вы не повторяетесь при создании регистратора?

Я думаю, что общая идиома для создания экземпляров java.util.logging.Logger такова:

public class SomeClassName {

    private static final Logger LOG = Logger.getLogger(SomeClassName.class.getName());

}

Моя IDE будет управлять изменением строки соответствующим образом, когда я реорганизую свой код (например, измените имя класса). Мне все еще кажется, что я должен повторить название класса. То, что я действительно хотел бы сделать, это что-то вроде Logger.getLogger(getName()) или Logger.getLogger(class.getName()), но это не законная Java в статической инициализации.

Есть ли лучший способ добраться до регистратора, который не требует повторения?

Ответ 1

Проблема 137 Информационного бюллетеня специалистов Java касается этой проблемы. Он рекомендует применять регистратор factory, который может определять фактическое имя класса, например. путем создания исключения и анализа стека вызовов.

Я лично считаю это хуже, чем оригинальная проблема, но это всего лишь мои 2 цента. Во всяком случае, технически это интересно, так вот оно:

public class LoggerFactory {
  public static Logger make() {
    Throwable t = new Throwable();
    StackTraceElement directCaller = t.getStackTrace()[1];
    return Logger.getLogger(directCaller.getClassName());
  }
}

...

public class BetterApplication {
  private final static Logger logger = LoggerFactory.make();

  ...
}

Ответ 2

Я создаю шаблон кода Eclipse и использую его каждый раз.

enter image description here

Вам просто нужно набрать logger и нажать Ctrl + Space, чтобы активировать его.

Ответ 3

Мы делаем это:

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

Ответ 4

Я использую плагин с именем log4e, который удобен для ведения журнала.

http://log4e.jayefem.de/

Вы можете использовать его для автоматического добавления до/после ведения журнала для метода или всего класса.
Также вы можете получить его, чтобы автоматически заменить System.out.println заявлениями журнала.
Очень удобно.

Ответ 5

Есть трюк, чтобы получить имя текущего класса из контекста static, я не могу его привести из памяти, но он включал в себя исключение из статического блока и чтение стека стека, чтобы получить имя класс. Тем не менее, это довольно взломать, поэтому на практике я нахожу себя лучше, чем играть с такими трюками.