Ответ 1
Перейдите в раздел "Запуск конфигураций в вашем eclipse", а аргументы -VM добавят следующее: -Dlog4j.configuration = log4j-config_folder/log4j.xml
замените log4j-config_folder вашей структурой папок, где у вас есть файл log4j.xml
По какой-то причине моя консоль Eclipse больше не отображает инструкции Log4j INFO и DEBUG при запуске тестов JUnit. Что касается кода, изменений не произошло, поэтому он должен иметь какое-то отношение к конфигурации Eclipse.
Все, что я делаю в моем Unit test, является следующим и по какой-то причине ТОЛЬКО оператор ERROR отображается в консоли Eclipse. Зачем? Где искать ключи?
public class SampleTest
{
private static final Logger LOGGER = Logger.getLogger(SampleTest.class);
@Before
public void init() throws Exception
{
// Log4J junit configuration.
BasicConfigurator.configure();
LOGGER.info("INFO TEST");
LOGGER.debug("DEBUG TEST");
LOGGER.error("ERROR TEST");
}
}
Подробнее:
Перейдите в раздел "Запуск конфигураций в вашем eclipse", а аргументы -VM добавят следующее: -Dlog4j.configuration = log4j-config_folder/log4j.xml
замените log4j-config_folder вашей структурой папок, где у вас есть файл log4j.xml
Посмотрите в файле log4j.properties
или log4j.xml
для уровня журнала. Вероятно, для ERROR
вместо DEBUG
Настройка с помощью BasicConfigurator.configure();
устанавливает базовый набор консольных приложений при отладке. Проект с настройкой выше и другим кодом (кроме теста) должен вывести три строки ведения журнала в консоли. Я не могу сказать ничего, кроме "это работает для меня".
Пробовали ли вы создать пустой проект с помощью только log4j и junit, только с указанным выше кодом и запуском?
Кроме того, чтобы запустить метод @Before
:
@Test
public void testname() throws Exception {
assertTrue(true);
}
EDIT:
Если вы запускаете более одного теста за один раз, каждый из них будет вызывать init перед запуском.
В этом случае, если у вас было два теста, у первого был бы один регистратор, а второй тест снова вызовет init, сделав его дважды в журнале (попробуйте) - вы должны получить 9 строк входа в консоль с двумя тестами.
Вы можете использовать статический метод init, аннотированный с помощью @BeforeClass
, чтобы избежать этого. Хотя это также происходит во всех файлах, вы можете посмотреть документацию по TestSuites в JUnit 4. И/или вызвать BasicConfigurator.resetConfiguration();
в аннотированном классе @AfterClass, чтобы удалить все регистраторы после каждого тестового класса/набора тестов.
Кроме того, корневой регистратор используется повторно, поэтому, если вы установите уровень корневого регистратора в методе тестирования, который выполняется на ранней стадии, он будет поддерживать этот параметр для всех других тестов, которые запускаются позже, даже если они находятся в разных файлах. (не произойдет при сбросе конфигурации).
Testcase - это вызовет 9 строк журнала:
import static org.junit.Assert.assertTrue;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
public class SampleTest
{
private static final Logger LOGGER = Logger.getLogger(SampleTest.class);
@Before
public void init() throws Exception
{
// Log4J junit configuration.
BasicConfigurator.configure();
}
@Test
public void testOne() throws Exception {
LOGGER.info("INFO TEST");
LOGGER.debug("DEBUG TEST");
LOGGER.error("ERROR TEST");
assertTrue(true);
}
@Test
public void testTwo() throws Exception {
LOGGER.info("INFO TEST");
LOGGER.debug("DEBUG TEST");
LOGGER.error("ERROR TEST");
assertTrue(true);
}
}
Изменение метода init сводится к исключенным шести строкам:
@BeforeClass
public static void init() throws Exception
{
// Log4J junit configuration.
BasicConfigurator.configure();
}
Вероятно, ваша проблема возникает в некоторых других тестовых классах или наборах тестов, где уровень ведения журнала корневого регистратора установлен на значение ERROR, а не reset.
Вы также можете проверить это, сбросив метод @BeforeClass, прежде чем устанавливать регистрацию.
Имейте в виду, что эти изменения могут нарушить ожидаемое ведение журнала для других тестовых случаев, пока оно не будет исправлено во всех местах. Я предлагаю попробовать, как это работает в отдельной рабочей области/проекте, чтобы понять, как это работает.
Следует отметить, что если у вас есть файл log4j.properties в вашем пути к классам, вам не нужно вызывать BasicConfigurator. Описание настройки файла свойств здесь.
Вы можете определить, является ли ваша среда IDE причиной проблемы, пытаясь запустить этот класс из командной строки с log4j.jar и log4j.properties в вашем пути к классам.
Мысль о том, что это был настоящий дефект, но оказалось, что размер консоли был ограничен, и было отключено старое содержимое за 80000 символов.
Щелкните правой кнопкой мыши на консоли для настроек и увеличьте ограничение размера консоли.
Проверьте файл log4j.properties
Посмотрите здесь простой пример здесь.
Уверен, что при запуске тестовых примеров junit у вас есть файл log4j.properties или log4j.xml в папке test/resources.
Похоже, что log4j получает другой файл конфигурации, чем тот, который вы думаете.
Поместите контрольную точку в log4j, где файл открывается, и посмотрите файлы getAbsolutePath().
Проверьте файлы конфигурации log4j в каталоге вывода (например, bin или target/classes) или в рамках созданных артефактов проекта (.jar/.war/.ear). Если это находится в вашем пути к классу, то его подхватывает log4j.
Добавьте тестовую зависимость к вашему pom в slf4j.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>${slf4j.version}</version>
<scope>test</scope>
</dependency>
Убедитесь, что ваш log4j.properties
или log4j.xml
скопирован в ваш путь к среде IDE и загружается при вызове BasicConfigurator.configure()
У меня когда-то была такая проблема, когда я загружал lib из Amazon (для веб-сервисов Amazon), и этот файл jar содержал файл log4j.properties и каким-то образом использовался вместо моего старого старого автономного log4j. Стоит проверить.
Есть случай, который я делаю: исключение случается где-то, но я выбрал исключение без печати ничего, таким образом, код даже не дошел до кода log4j, поэтому никакого вывода.
У меня была такая же ошибка.
Я использую Jboss 7.1 AS. В файле конфигурации - standalone.xml отредактируйте следующий тег. (остановите свой сервер и отредактируйте)
<root-logger>
<level name="ALL"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
ALL имеет самый низкий ранг и предназначен для включения всех протоколов.
Окно консоли Eclipse имеет свойство фильтра (в некоторых случаях активна только system.err).
Rigt щелкните в окне консоли Eclipse → Настройки → Консоль и убедитесь, что флажок
Показывать, когда программа записывается в стандартный
активен.
В качестве альтернативы вы можете настроить log4j для записи всегда в System.err следующим образом:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="AppConsole" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.err" />
<param name="Encoding" value="ISO-8859-15" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{dd.MM.yyyy HH:mm:ss} %5p kontext.%c{1}:%L - %m%n" />
</layout>
</appender>
<root>
<level value="debug" />
<appender-ref ref="AppConsole" />
</root>
</log4j:configuration>
если файл log4j.xml отсутствует в проекте, и вы используете tomcat, попробуйте перейти к экземпляру tomcat и выполнить поиск log4j. Попробуйте изменить уровень консолиAppender для отладки и повторного развертывания приложения в tomcat. Это может помочь.
Моя ситуация была решена путем указания аргумента VM для отлаживаемой программы JAVA, я полагаю, вы также можете установить это в файле `eclipse.ini, а также:
Простой файл log4j.properties может выглядеть следующим образом:
log4j.rootCategory=debug,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.immediateFlush=true
log4j.appender.console.encoding=UTF-8
log4j.appender.console.threshold=info
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=%d [%t] %-5p %c - %m%n
Поместите его в свой путь к классам (папка target/classes). Или вы, если у вас есть проект Maven, поместите его в ваш src/main/resources, и Eclipse скопирует его в ваш путь к классам.
Без файла конфигурации вы должны увидеть предупреждение Eclipse в консоли, например:
log4j:WARN No appenders could be found for logger.
log4j:WARN Please initialize the log4j system properly.