Если я правильно понимаю, то, что вы имеете в данный момент:
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 к вашему classpath. В 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 вы можете настроить один аппендер на один файл.
# 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());
, и в этом случае добавление регистратора в класс становится вырезкой и вставкой одной строки. См. Должен ли я объявить ссылки в журнале статическими или нет? (к сожалению, ссылка на вики-страницу не работает), но страница slf4j также содержит хорошее объяснение. Поэтому используйте нестатические поля, если у вас нет веских причин не делать этого.
Кэмерон прав, когда говорит, что вы должны попытаться использовать slf4j , если это возможно, у него есть одна убийственная особенность, вы можете использовать несколько каркасов ведения журналов с ним.
[*] и я имею в виду много.