Использование XML файла (log4j2.xml) для настройки Log4j 2

Я хочу использовать новую Log4J 2-Java Logging Framework. Все работает нормально, но я пробовал через час загрузить пользовательский файл конфигурации, чтобы настроить ведение журнала (например, уровень журнала).

Это мой log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
  <appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
  </appenders>
  <loggers>
    <root level="error">
      <appender-ref ref="Console"/>
    </root>
  </loggers>
</configuration>

Я пробовал следующее, но ничего не работает:

  • Переместите файл log4j2.xml так, чтобы он находился в пакете по умолчанию.
  • Переместите файл log4j2.xml в любом месте проекта
  • Назовите файл log4j2.xml как "log4j.xml"
  • Создайте папку в своем проекте, поместите там файл log4j2.xml и добавьте эту папку в свой путь к классу среды выполнения

Поскольку официальный сайт не может мне помочь, я надеюсь, что вы можете помочь мне заставить Log4j 2 работать с моим конфигурационным файлом.

Ответ 1

Важно: убедитесь, что имя файла конфигурации log4j2.xml (обратите внимание на 2 до периода), а не на log4j.xml

Моя догадка ничего не происходит, потому что ничего не регистрируется с использованием уровня ошибки. Возможно, вы захотите добавить еще один регистратор:

<logger name="com.foo.Bar" level="trace">
  <appender-ref ref="Console"/>
</logger>

Похоже, что Configuration может быть хорошим ресурсом.

Чтобы уточнить, вы указываете регистратор с уровнем, установленным на "ошибка":

<root level="error">
  <appender-ref ref="Console"/>
</root>

Это означает, что в журнале будут отображаться только сообщения, зарегистрированные с использованием Level.ERROR. Добавление регистратора с менее ограничительным уровнем позволит больше сообщений появляться в журнале. Я рекомендую взглянуть на раздел Architecture руководства (если вы прокрутите страницу вниз, вы увидите таблицу, объясняющую уровни ведения журнала). Кроме того, вы можете просто изменить уровень корневого регистратора на трассировку (вместо добавления нового регистратора)

Учитывая указанную вами конфигурацию, выполнение кода ниже дает что-то вроде 13:27:50.244 [main] ERROR com.example.Log4j2Tester - testing ERROR level

package com.example;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4j2Tester {
    private static final Logger LOG = LogManager.getLogger(Log4j2Tester.class);

    public static void main(String[] args) {
        LOG.error("testing ERROR level");

//if you change the level of root logger to 'trace'
//then you'll also see something like
//    13:27:50.244 [main] TRACE com.example.Log4j2Tester - exiting application
        LOG.trace("exiting application");
    }
}

Ответ 2

СОВЕТ: Использовать пользовательские файлы log4j. (Скорее дефолт "log4j2.xml" thingie). Возможно, было бы полезно иметь несколько конфигураций в некоторых случаях.

На всякий случай, если кто-либо использует maven и хочет настроить log4j2, вот что вам нужно в вашем pom.xml:

                <systemProperties>
                    <property>
                        <name>/log4j.configuration</name>
                        <value>.../../Foo-log4j.xml</value>
                    </property>
                </systemProperties>

По умолчанию "log4j2.xml" - это ожидаемое имя файла. Но мы можем переопределить это, установив свойство system log4j.configuration. В приведенном выше примере я использовал настраиваемый файл конфигурации как "Foo-log4j.xml".

Вы можете сделать то же самое через CLI:

-Dlog4j.configuration="Foo-log4j.xml"

Ответ 3

Мои 2 цента:

Программная система: log4j 2, NetBeans и TestNG.

У меня была та же проблема, но с тестовой средой.

По умолчанию (то есть в файле log4j2.xml, расположенном в src/), уровень ведения журнала установлен на ошибку. Но при запуске тестов я хочу, чтобы журнал был трассировкой. И, конечно же, зашел в какой-то более или менее жесткий код.

То есть изначально я сделал что-то вроде:

public class someTestClass {
       static final Logger log=LogManager.getLogger("test.someTestClass");
......
@Test
public void SomeMethod(){

System.setProperty("log4j.configurationFile", "resources/log4j2_conf.xml");

log.trace("This will not show because the default logging level is ERROR
and the resources/log4j2_conf.xml is not loaded");

}

Проблема заключается в том, что к тому моменту, когда будет выполняться инструкция System.setProperty, log4j уже будет установлен (то есть будет выполнен первый запуск журнала Logger =...)

Что я сделал, используется @BeforeClass следующим образом:

 public class someTestClass {
    Logger log;      
    @BeforeClass
    public void setLogger(){
        SetEnv.SetEnvironment();
        log = LogManager.getLogger("TestRealClientRealServer");
    }
......
    @Test
    public void SomeMethod(){

        log.trace("This will show, because in log4j2_conf.xml
 the root level is set to TRACE");

    }
}

BTW, ресурсы/могут быть помещены в тестовые пакеты, поэтому вы не отправляете "test" log4j setup.

Надеюсь, что это поможет

Ответ 4

Кроме того, чтобы использовать файл конфигурации по умолчанию log4j2.xml(или log4j2-test.xml) в корневой папке пути класса, вы можете использовать это системное свойство, чтобы указать путь к файлу конфигурации (используйте -D в команде java строка)

log4j.configurationFile='xxxx/xxx/xxx'  

Ответ 5

Совет для пользователей eclipse:

Щелкните правой кнопкой мыши по проекту и нажмите "Обновить". Убедитесь, что вы видите файл log4j2.xml в eclipse.

Полный ответ здесь: log4j 2 - проблема с настройкой

Ответ 6

Это более ценный совет для решения проблемы "Не делаю, если файл журнала conf читается". Запустите свой jvm с опцией -Dlog4j.debug. При запуске он напечатает весь файл конфигурации журнала, который он пытается прочитать. Это будет перечислять один за другим. Последний отображается тот, который использует система.

Если вы находитесь на сервере JEE, вам, вероятно, потребуется поместить его в файл "jvm.options". Если это баночка, просто запустите java с -Dlog4j.debug.

Ответ 7

Поместите LOG4J2.XML в корневую папку проекта src/main.