Как вы не повторяетесь при создании регистратора?
Я думаю, что общая идиома для создания экземпляров 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
, я не могу его привести из памяти, но он включал в себя исключение из статического блока и чтение стека стека, чтобы получить имя класс. Тем не менее, это довольно взломать, поэтому на практике я нахожу себя лучше, чем играть с такими трюками.