在为Log4j2
添加 context-param和Log4jConfigListener 之前,我已将所有日志列在 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文件中列出的remineds日志。不在我的log4j文件中。
答案 0 :(得分:10)
您没有指定Spring版本和Servler版本..
自Spring 4.2.1起,Log4jConfigListener
已被弃用。
假设您使用的是Spring版本4.2.1(+),Servlet 3.0(+)和Log4j2。现在你所要做的就是:
log4jConfiguration
上下文参数。指定配置文件的xml。所以你根本不必指定任何听众。
Log4j2's documentation出现了很好的描述。
答案 1 :(得分:0)
注意,你的log4j配置文件名是log4j 2 .xml,所以试图指向log4j.xml是没有意义的。 请注意,除非使用2.5以下的servlet容器,否则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
是Web应用程序支持。
答案 2 :(得分:0)
请参阅org.springframework.web.util.Log4jConfigListener的源代码。它期望一个名为“log4jConfigLocation”的系统属性。如果文件位于类路径中,则此属性应保存文件的位置,然后其值应为classpath:/logs/log4j2.xml。如果它是文件资源,那么它应该是file://Users/logs/log4j2.xml。 所以在web.xml中添加一个上下文parm。 例如:
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>file://Users/logs/log4j2.xml</param-value>
</context-param>
另请注意,spring的Log4jConfigListener适用于log4j 1.x版本。