Ввод регистраторов Log4j в несколько классов - PullRequest
1 голос
/ 18 октября 2011

Я хочу добавить запись в довольно мало классов в моей программе. Нужно ли добавлять строки для определения регистратора в каждый класс, для которого требуется регистратор (я хочу избежать передачи объекта регистратора вокруг моей программы.

public class SomeClass {
  static Logger logger = Logger.getLogger(SomeClass.class);
  .......

Если я сделаю это, могу ли я получить этот вызов, чтобы «узнать» его класс (что-то вроде this.class Или есть альтернативные способы сделать это

Ответы [ 3 ]

2 голосов
/ 18 октября 2011

Одна альтернатива, которую я нахожу удобной, - создать абстрактный класс, который создает для вас Loggers:

public abstract class AbstractLoggingThing {
    private final Logger log = LoggerFactory.getLogger(this.getClass());

    protected Logger getLog() {
        return log;
    }
}

Тогда, по соглашению, каждый класс, который наследует от него, имеет правильно сконфигурированный Logger, и вам не нужно иметь один и тот же глупый код повсюду. Большинство ваших классов в проекте могут легко включить это в свою иерархию наследования, а для тех, которые по какой-либо причине не могут, вы все равно можете вернуться к старому стилю. Вы также можете добавить удобные методы, такие как:

    protected void info(String message, Object... args) {
        // What goes here depends on your logging library
    }
1 голос
/ 18 октября 2011

Нет, вам не нужно , чтобы сделать это, , но это привычная и хорошая практика.Log4j был построен вокруг этого предположения, что люди будут использовать его таким образом.Это дает вам бесплатно местоположение места, где было создано событие журнала, а также простое администрирование уровня журнала для целых ветвей регистраторов.

Теоретически, вы можете разделить регистратор между несколькими классами, илидаже есть только один глобальный;Logger потокобезопасен, и в любом случае он должен синхронизироваться при добавлении объекта, чтобы ваша производительность не пострадала.Вы также можете назвать его как угодно, не нужно использовать имя класса.Однако не рекомендуется, по той причине, о которой я говорил выше.

Кроме того, вам не нужно указывать ссылку static, поскольку log4j следит за тем, чтобы вы могли создать только один регистратор с заданным именем.вы не тратите память, храня ее в переменной экземпляра.

1 голос
/ 18 октября 2011

Да, вам нужно добавить строки для каждого класса. Если ваш логгер статичен (как в вашем примере), вам нужно указывать класс каждый раз, как вы это делали (SomeClass.class). Если вы сделаете свой регистратор нестатичным, вы можете использовать this.getClass (), который был бы более дружественным к вырезке:

public class SomeClass {
  private Logger logger = Logger.getLogger(this.getClass());
  .......
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...