>@Test
>public void testLogCreate() {
> Logger logger = Logger.getLogger("MyLogger");
> logger.info("hello");
>}
При запуске журнальный модуль выдает ошибку. В описании ошибки говорится, что нам понадобится нечто под названием Appender. После непродолжительных поисков в документации обнаруживается класс ConsoleAppender. Соответственно, мы создаем объект ConsoleAppender и проверяем, удалось ли нам раскрыть секреты вывода журнала на консоль:
>@Test
>public void testLogAddAppender() {
> Logger logger = Logger.getLogger("MyLogger");
> ConsoleAppender appender = new ConsoleAppender();
> logger.addAppender(appender);
> logger.info("hello");
>}
На этот раз выясняется, что у объекта Appender нет выходного потока. Странно – логика подсказывает, что он должен быть. После небольшой помощи от Google опробуется следующее решение:
>@Test
>public void testLogAddAppender() {
> Logger logger = Logger.getLogger("MyLogger");
> logger.removeAllAppenders();
> logger.addAppender(new ConsoleAppender(
> new PatternLayout("%p %t %m%n"),
> ConsoleAppender.SYSTEM_OUT));
> logger.info("hello");
>}
Заработало; на консоли выводится сообщение со словом «hello»! На первый взгляд происходящее выглядит немного странно: мы должны указывать ConsoleAppender, что данные выводятся на консоль.
Еще интереснее, что при удалении аргумента ConsoleAppender.SystemOut сообщение «hello» все равно выводится. Но если убрать аргумент PatternLayout, снова начинаются жалобы на отсутствие выходного потока. Все это выглядит очень странно.
После более внимательного чтения документации мы видим, что конструктор ConsoleAppender по умолчанию «не имеет конфигурации» – весьма неочевидное и бесполезное решение. Похоже, это ошибка (или по крайней мере нелогичность) в log4j.
После некоторых поисков, чтения документации и тестирования мы приходим к листингу 8.1. Попутно мы получили много полезной информации о том, как работает log4j, и закодировали ее в наборе простых модульных тестов.
Листинг 8.1. LogTest.java
>public class LogTest {
> private Logger logger;
> @Before
> public void initialize() {
> logger = Logger.getLogger("logger");
> logger.removeAllAppenders();
> Logger.getRootLogger().removeAllAppenders();
> }
> @Test
> public void basicLogger() {
> BasicConfigurator.configure();
> logger.info("basicLogger");
> }
> @Test
> public void addAppenderWithStream() {
> logger.addAppender(new ConsoleAppender(
> new PatternLayout("%p %t %m%n"),
> ConsoleAppender.SYSTEM_OUT));
> logger.info(“addAppenderWithStream”);