Конфигурация Log4j2.xml в web.xml. IllegalArgumentException - URI не является абсолютным

Перед добавлением context-param и Log4jConfigListener для Log4j2 У меня были все журналы, перечисленные в файле catalina.out.

Итак, сейчас я пытаюсь настроить log4j для моего веб-приложения.

В web.xml Я добавил необходимые настройки.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>etl-service</display-name>

    <!-- Support for Spring -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:applicationContext.xml</param-value>
    </context-param>

    <context-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>myprofile</param-value>
    </context-param>

    <context-param>
        <param-name>log4jConfiguration</param-name>
        <param-value>/WEB-INF/classes/log4j2.xml</param-value>
    </context-param>

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <listener>
        <listener-class>
            org.springframework.web.util.Log4jConfigListener
        </listener-class>
    </listener>


</web-app>

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace" strict="true" name="XMLConfigTest"
               packages="">         

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>

        <RollingRandomAccessFile name="RollingRandomAccessFileDebug" fileName="/local/deploy/logs/debug.log"
                                 filePattern="logs/$${date:yyyy-MM}/etl-%d{MM-dd-yyyy}-%i.log.gz"
                                 immediateFlush="false"
                                 append="false">
            <PatternLayout>
                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingRandomAccessFile>
        <RollingRandomAccessFile name="RollingRandomAccessFile" fileName="/local/deploy/logs/info.log"
                                 filePattern="logs/$${date:yyyy-MM}/etl-%d{MM-dd-yyyy}-%i.log.gz"
                                 immediateFlush="false"
                                 append="false">
            <PatternLayout>
                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingRandomAccessFile>
        <!--<Async name="AsyncConsole">-->
        <!--<AppenderRef ref="Console"/>-->
        <!--</Async>-->
    </Appenders>
    <Loggers>
        <Root  level="TRACE">
            <AppenderRef ref="RollingRandomAccessFileDebug" level="DEBUG"/>
            <AppenderRef ref="RollingRandomAccessFile" level="INFO"/>
            <AppenderRef ref="Console"  level="TRACE"/>
        </Root>
    </Loggers>
</Configuration>

Но сейчас у меня есть следующая ошибка:

ERROR Unable to access WEB-INF/classes/log4j2.xml java.lang.IllegalArgumentException: URI is not absolute

Может быть, кто-то уже сталкивался с такой проблемой. Также я попытался вместо того, чтобы добавить /WEB-INF/classes/log4j.xml использование classpath*:log4j.xml

И произошла ошибка java.net.URISyntaxException: Illegal character in schema name at 9 index: classpath*:log4j.xml

ОБНОВЛЕНИЕ: Нам нужно добавить только имя файла дескриптора, и это работает.

<context-param>
            <param-name>log4jConfiguration</param-name>
            <param-value>log4j2.xml</param-value>
        </context-param>

Но проблема напоминает логи, перечисленные в файле catalina.out. Не в моих файлах log4j.

3 ответа

Вы не указали версию Spring и версию Servler.

С весны 4.2.1 года Log4jConfigListener устарела.

Предположим, вы используете Spring версии 4.2.1(+), Servlet 3.0(+) и Log4j2. Теперь все, что вам нужно сделать, это:

  1. добавить новую зависимость log4j-web,
  2. a) поместите файл log4j2.xml в папку WEB-INF ИЛИ b) поместите конфигурацию log4j2 в classpath и определите log4jConfiguration контекстный параметр в файле web.xml с указанным файлом конфигурации.

Так что вам не нужно указывать какого-либо слушателя вообще.

Вот документация для Log4j2, в которой он описан довольно хорошо.

См. Исходный код org.springframework.web.util.Log4jConfigListener. Ожидается системное свойство с именем "log4jConfigLocation". Это свойство должно содержать местоположение файла, если он находится в classpath, тогда его значение должно быть classpath:/logs/log4j2.xml. Если это файловый ресурс, то это должен быть файл://Users/logs/log4j2.xml. Так что добавьте контекстный параметр в web.xml. Например:

<context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>file://Users/logs/log4j2.xml</param-value>
 </context-param>

Также обратите внимание, что весенний Log4jConfigListener работает с версией log4j 1.x.

Обратите внимание, что имя вашего файла конфигурации log4j - log4j2.xml, поэтому пытаться указать на log4j.xml совершенно бессмысленно. Пожалуйста, обнаружите, что если вы не используете контейнер сервлетов ниже 2.5, ваш log4j может быть настроен сам по себе.

Прежде всего, проверьте правильность конфигурации log4j. Начать контейнер с -Dlog4j.configurationFile указывая на ваш log4j2.xml. Вы также можете добавить отладку с -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=debug

Используя tomcat, отредактируйте ваш ${catalina.home}/bin/setenv.sh (или.bat, если используете windows) и добавьте его в переменную JAVA_OPTS.

Если ваш log4j начнет регистрировать как файл, так и консоль, попробуйте удалить оба:

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>/WEB-INF/classes/log4j2.xml</param-value>
</context-param>

так же как:

<listener>
    <listener-class>
        org.springframework.web.util.Log4jConfigListener
    </listener-class>
</listener>

Spring основан на log4j 1.x, поэтому добавьте зависимости в вашу сборку (пример maven):

        <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>${log4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>${log4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-web</artifactId>
        <version>${log4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-1.2-api</artifactId>
        <version>${log4j.version}</version>
    </dependency>

куда log4j-1.2-api совместимость API, и log4j-web это поддержка веб-приложений.

Другие вопросы по тегам