Log4j2.xml web.xml 中的配置.IllegalArgumentException - uri 不是绝对的



在为Log4j2添加上下文参数和Log4jConfigListener之前,我将所有日志都列在catalina.out文件中。

所以现在,我正在尝试为我的 Web 应用程序配置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 文件中。

您没有指定 Spring 版本和 Servler 版本。

从 Spring 4.2.1 开始,Log4jConfigListener被弃用。

假设你使用的是 Spring 版本 4.2.1(+)、Servlet 3.0(+) 和 Log4j2。现在您所要做的就是:

  1. 添加新的依赖 log4j-web
  2. a) 将 log4j2
  3. .xml 文件放入 WEB-INF 文件夹或 b) log4j2 配置放入类路径中,并在 web.xml 中定义log4jConfiguration上下文参数,并指定配置文件。

因此,您根本不需要指定任何侦听器。

这是 Log4j2 的文档,它很好地描述了它。

注意,你的 log4j 配置文件名是 log4j2.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(如果使用 windows,则编辑.bat)并将其添加到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应用程序支持。

请参阅 org.springframework.web.util.Log4jConfigListener 的源代码。它需要一个名为"log4jConfigLocation"的系统属性。如果文件位于类路径中,则此属性应保存文件的位置,则其值应为 classpath:/logs/log4j2.xml。如果它是文件资源,则应 file://Users/logs/log4j2.xml。因此,在 web.xml 中添加一个上下文参数。例如:

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

另请注意,Spring 的 Log4jConfigListener 适用于 log4j 1.x 版本。

相关内容

最新更新