Конфигурация 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. Теперь все, что вам нужно сделать, это:
- добавить новую зависимость log4j-web,
- 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
это поддержка веб-приложений.