URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9466
[ Назад ]

Исходное сообщение
"Если не создавать экземпляр класса, где вызвать иниц. логгера?"

Отправлено Sasha Corelinen , 23-Май-12 21:58 
В Java классе все методы-функции static. Т.к. static, то нет смысла в коде специально своими руками создавать экземпляры этого класса, сразу можно вызывать - ИмяКласса.имяМетода().

В методах вызывается log4j. Log4j положено инициализировать. Можно инициализацию вызвать в конструкторе, но ведь экземпляр-то класса не создаётся, и потому конструктор не бывает вызван, и потому инициализация оттуда не вызывается без создания нового экземпляра.

Выходит: в каждый static метод надо незабывать ставить в начале инициализацию логгера. Это даёт иниц. логгера, но можно забыть вставить эту инит.строку.

Как бы организовать автоматичекую инициализацию в единственном месте, и так, чтобы невозможно было забыть написать вызов этого Инит???

Пример кода:

class AClassName {
    private static final Logger LOG = Logger.getLogger(AClassName.class);

    /* Не бывает вызван без создания экз.класса.
     */
    public VCardSamsungHelper() {
        LoggerHelper.initLogger(LOG);
    }

    /* Метод ниже можно вызывать без специального создания экз.класса.
     * Например:
     *    AClassName.doSomething();
     */
    public static void doSomething () {
        // Нужно в каждый метод ставить иниц.:
        // ---> LoggerHelper.initLogger(LOG);

        // Вызов логгера.
        LOG.info("Строчка в журнал.")
    }
}


Если нужно, то вот LoggerHelper, но он напрямую не касается вопроса:

public class LoggerHelper {

    public static void initLogger(Logger log) {
        log.setLevel(Level.INFO);
        ConsoleAppender ca = new ConsoleAppender(new PatternLayout("%d{ISO8601} [%5p %c{1}:%L] %m%n"));
        ca.setTarget("System.out");
        log.addAppender(ca);
    }
}

P.S. Откуда родился вопрос. Если логгер не инициализировать, то он в ответ на одинарный вызов сыпет в консоль порядка сотни дублей сообщения. Ок. Тогда можно конфиг. файл сделать, но голову сломал, как на всю программу сделать единственный централизованный файл конфига. Можно сделать как выше - "вшить" в код инит. в отдельном классе-хелпере. Но тогда вопрос, тот что выше.


Содержание

Сообщения в этом обсуждении
"Если не создавать экземпляр класса, где вызвать иниц. логгера?"
Отправлено Sasha Corelinen , 23-Май-12 22:48 
"P.S. о повторах" не по теме. Он ошибочен. Повторы - отдельная тема иерархии логгеров и совпадения appender'ов.

"Если не создавать экземпляр класса, где вызвать иниц. логгера?"
Отправлено 1 , 24-Май-12 10:11 
public clss A {
static {
  //static init code
}
}

"Если не создавать экземпляр класса, где вызвать иниц. логгера?"
Отправлено deadmustdie , 24-Май-12 12:24 
> public clss A {
>  static {
>   //static init code
>  }
> }

+1

Вообще же по классике в один из основных jar-ников приложения кладут файл настроек логгера.


"Если не создавать экземпляр класса, где вызвать иниц. логгера?"
Отправлено Sasha Corelinen , 12-Июн-12 22:42 
> Вообще же по классике в один из основных jar-ников приложения кладут файл
> настроек логгера.

Да. В Eclipse при отладке и т.п. надо делать это автоматически. Не знаю как.

Нашёл вариант: упаковать файл в jar, и этот jar поместить в build path или подключить как библиотеку. В терминах Eclipse.