Если я правильно понимаю, что вы имеете в минуту:
public class Main {
public static final Logger LOGGER = Logger.getLogger(Main.class);
}
public class AnotherClass {
public void doSomething() {
Main.LOGGER.debug("value=" + value);
}
}
или, вы передаете ссылки на регистраторе в конструкторах класса.
Во-первых, вы можете использовать один глобальный регистратор, просто используя один и тот же значение, передаваемое Logger.getLogger, как:
public class Main {
private static final Logger LOGGER = Logger.getLogger("GLOBAL");
}
public class AnotherClass {
private final Logger LOGGER = Logger.getLogger("GLOBAL");
public void doSomething() {
LOGGER.debug("value=" + value);
}
}
Это использует точно такой же регистратор, Logger.getLogger возвращает тот же объект в обоих вызовов , У вас больше нет зависимости между классами, и это будет работать.
Другая вещь, которую я собираю из ваших комментариев, заключается в том, что вы настраиваете вручную (используя BasicConfigurator.configure
. В большинстве случаев это необязательно, и вы должны выполнять свою конфигурацию, просто добавляя log4j.properties или log4j. xml для вашего пути к классам. В Eclipse это делается путем добавления его в src/(или src/main/resources, если вы используете maven). Если вы используете junit, добавьте его в каталог test/source (или src/test/resources с maven). Это гораздо лучший долгосрочный способ настройки log4j, потому что вам не нужно передавать информацию между классами.
Также рекомендуемый способ использования регистраторов - передать класс Logger.getLogger(). Таким образом, вы можете фильтровать вывод, основанный на имени класса, который, как правило, гораздо полезнее, чем просто один глобальный регистратор:
public class Main {
private static final Logger LOGGER = Logger.getLogger(Main.class);
public static final main(String[] args) {
LOGGER.debug("started");
}
}
public class AnotherClass {
private final Logger LOGGER = Logger.getLogger(this.getClass());
public void doSomething() {
LOGGER.debug("value=" + value);
}
}
Тогда в log4j.properties, вы можете настроить один Appender в один файл ,
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
Наконец, нет необходимости объявлять все ваши регистраторы статическими. Это только делает заметную разницу, если вы делаете лотов [*] создания объекта. Объявление ваших регистраторов как нестатических полей позволяет использовать Logger.getLogger(this.getClass());
, и в этом случае добавление регистратора в класс становится срезом и вставкой одной строки. См. Should I declare Log references static or not? (к сожалению, ссылка на wiki-страницу сломана), но также есть хорошее объяснение, но slf4j page. Поэтому используйте нестатические поля, если у вас нет оснований для этого.
Камерон прав, когда он говорит, что вы должны попробовать и использовать slf4j, если это возможно, у него есть одна функция убийцы, вы можете использовать с ней несколько фреймворков регистрации.
[*] и я имею в виду много.
Я сделал то, что вы упоминали, но печатаются только журналы в классе Main, журналы других методов не печатаются? как это исправить –