Log4j2 и Jboss EAP 7: ведение журнала исключений

У меня запущено веб-приложение на Jboss EAP 7.0.2. В моем приложении я хочу использовать Log4j2 для ведения журнала. Итак, я добавил log4j2 и log4j-slf4j-impl как зависимости:

build.gradle

compile 'org.apache.logging.log4j:log4j-core:2.7'
compile 'org.apache.logging.log4j:log4j-api:2.7'
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.7'

Поместите файл jboss-deployment-structure.xml:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <exclude-subsystems>
            <subsystem name="logging" />
        </exclude-subsystems>
        <exclusions>
            <module name="org.apache.commons.logging" />
            <module name="org.apache.log4j" />
            <module name="org.jboss.logging" />
            <module name="org.jboss.logging.jul-to-slf4j-stub" />
            <module name="org.jboss.logmanager" />
            <module name="org.jboss.logmanager.log4j" />
            <module name="org.slf4j" />
            <module name="org.slf4j.impl" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

Создан log4j2.xml (я опускаю его содержимое, но он записывает журнал в файл lea.log).

Также у меня есть TestRestService

@Path("/test")
public class TestRestService {
    private Logger logger  = LogManager.getFormatterLogger(TestRestService.class);
    private org.slf4j.Logger slf4jLogger = LoggerFactory.getLogger(TestRestService.class);

    @GET
    @Path("/logger")
    public void testLogger() {
        logger.info("Log4j2 log");
        slf4jLogger.info("SLF4J log");
        throw new RuntimeException("Test");
    }
}

Этот тестовый метод записывает в lea.log:

2016-11-07 15:25:37.673 [default task-7] INFO  ru.rshb.test.TestRestService - Log4j2 log
2016-11-07 15:25:37.673 [default task-7] INFO  ru.rshb.test.TestRestService - SLF4J log

но это не регистрирует исключение!

В server.log я вижу:

2016-11-07 15:25:37,673 INFO  [stdout] (default task-7) INFO  - Log4j2 log

2016-11-07 15:25:37,673 INFO  [stdout] (default task-7) INFO  - SLF4J log

2016-11-07 15:25:37,674 ERROR [io.undertow.request] (default task-7) UT005023: Exception handling request to /lea-core/rest/test/logger: org.jboss.resteasy.spi.UnhandledException: java.lang.RuntimeException: Test
...

Вопросы:

  1. Как я могу направить все сообщения и исключения, которые произошли в моем приложении, в lea.log (мой файл журнала log4j2)?
  2. Предполагается ли запись в файл server.log, даже если я исключил подсистему ведения журнала из своего развертывания?

person 3biga    schedule 07.11.2016    source источник


Ответы (1)


Вы генерируете исключение из конечной точки REST и не обрабатываете его. Следовательно, сервер обрабатывает это за вас, который не может войти в конфигурацию журнала ваших приложений.

Исключение подсистемы ведения журнала остановит обработку вашего развертывания подсистемой ведения журнала. (Это означает, что вам не нужны эти исключения модуля). Однако сам сервер по-прежнему будет использовать конфигурацию из подсистемы ведения журнала.

Если вы хотите перехватить исключения определенного типа, вы можете использовать _ 1_, чтобы зарегистрировать исключение, а затем создать для него ответ.

person James R. Perkins    schedule 09.11.2016
comment
Спасибо за ответ. Мне не нравится ловить все исключения в моем приложении. Я пытаюсь использовать функцию ведения журнала маршрутизации Log4j2 (или SiftingAppernder, как она называется в Logback). Насколько я понимаю, в подсистеме ведения журнала по умолчанию нет функции просеивания. Итак, я думаю, что лучшим вариантом для меня будет включение Logback в качестве среды ведения журналов сервера (как описано в здесь, например). Это правильно? - person 3biga; 09.11.2016
comment
Это может работать для самого WildFly, но если другие зависимости используют log4j или JUL, вы можете не получить эти сообщения журнала, направленные на возврат. - person James R. Perkins; 09.11.2016
comment
Я нахожу немного странным, что не могу использовать log4j2 в EAP! - person Tom; 23.01.2017
comment
Вы можете использовать log4j2 в EAP в своем приложении. Однако серверные компоненты не будут использовать log4j2. - person James R. Perkins; 23.01.2017