Как избежать повторения при создании регистратора? - PullRequest
10 голосов
/ 30 марта 2012

Я думаю, что общая идиома создания экземпляров 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 в статической инициализации.

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

Ответы [ 5 ]

10 голосов
/ 30 марта 2012

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

Лично я нахожу это хуже, чем исходная проблема, но это только мои 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();

  ...
}
8 голосов
/ 30 марта 2012

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

enter image description here

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

1 голос
/ 30 марта 2012

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

http://log4e.jayefem.de/

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

1 голос
/ 30 марта 2012

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

private Logger log = Logger.getLogger(this.getClass());
0 голосов
/ 30 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...