使用Log4j2记录Spring应用程序日志

19

我正在尝试使用Log4j2将spring日志打印到文件和控制台。我猜这是我的Log4j2配置问题。我一直没有能够让它工作。我的log4j2.xml文件中有以下配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration name="defaultConfiguration" status="warn" strict="true" monitorInterval="5">
    <properties>
        <property name="patternlayout">%d{ISO8601} [%t] %-5level %logger{36} - %msg%n%throwable{full}</property>
        <property name="filename">${env:MY_ROOT}/logs/mylog.log</property>
        <property name="filenamePattern">${env:MY_ROOT}/logs/mylog-%d{yyyy-dd-MM}-%i.log.gz</property>
    </properties>
    <appenders>
        <appender name="Console" type="Console" target="SYSTEM_OUT">
            <layout type="PatternLayout" pattern="${patternlayout}" />
        </appender>
        <appender name="File" type="RollingFile" fileName="${filename}" filePattern="${filenamePattern}" bufferedIO="true" immediateFlush="true"
        append="true">
            <layout type="PatternLayout" pattern="${patternlayout}" />
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="50 MB" />
            </Policies>
            <DefaultRolloverStrategy max="30" />
        </appender>
        <appender name="AsynchFile" type="asynch" blocking="true" bufferSize="128">
            <appender-ref ref="File" />
        </appender>
    </appenders>
    <loggers>
        <root level="info">
            <appender-ref ref="Console" />
            <appender-ref ref="AsynchFile" />
        </root>
        <logger name="org.springframework.beans">
            <appender-ref ref="Console" />
            <appender-ref ref="AsynchFile" />
        </logger>
    </loggers>
</configuration>

这些是我pom文件中的依赖项:(可能有一些不是必需的)

<dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-api</artifactId>
 <version>1.6.6</version>
</dependency>

<dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-log4j12</artifactId>
 <version>1.6.6</version>
</dependency>

<dependency>
 <groupId>org.apache.logging.log4j</groupId>
 <artifactId>log4j-api</artifactId>
 <version>2.0-beta5</version>
</dependency>

<dependency>
 <groupId>org.apache.logging.log4j</groupId>
 <artifactId>log4j-core</artifactId>
 <version>2.0-beta5</version>
</dependency>
<dependency>
 <groupId>org.apache.logging.log4j</groupId>
 <artifactId>log4j-1.2-api</artifactId>
 <version>2.0-beta5</version>
</dependency>

<dependency>
 <groupId>com.lmax</groupId>
 <artifactId>disruptor</artifactId>
 <version>3.0.0.beta3</version>
</dependency>

我在我的Java代码中没有做任何与spring相关的事情。我正在使用来自Apache Camel的Main类,它会读取我的spring配置并加载bean。

我做错了什么?谢谢!

编辑:我没有在任何输出(控制台或文件)中获得spring日志。但是,我能够在我的Java代码中创建日志。希望这个澄清可以帮助。

2个回答

21

这个问题是由于使用了common-logging 1.X造成的,所以如果想将这个日志路由到Log4j 2中,你需要在你的pom.xml文件中添加依赖。

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-jcl</artifactId>
    <version>2.1</version>
 </dependency>

请勿删除您的common-logging 1.X依赖项。


4
您或许希望补充说明,log4j-jcl的版本需与所使用的log4j2版本相匹配,否则可能会出现类不匹配的问题。 - K Erlandsson
我遇到了一个更棘手的问题,某个依赖项在我不知情的情况下引入了log4j-jcl的旧版本,并且该旧版本需要log4j1而不是log4j2。通过dependency-tree发现了这个问题。这是需要注意的事情。 - SpareTheRod

15

查看您pom文件的依赖关系,发现您有这个依赖: slf4j-log4j12。这会导致针对slf4j api的日志语句被路由到Log4j-1.2实现。您可能希望将这些语句路由到Log4j-2.0实现。请尝试使用log4j-slf4j-impl替换slf4j-log4j12并再次尝试。


我已经更新了我的帖子,这样你就可以得到更多关于我的问题的信息。感谢你的帮助。 - hveiga
直到今天我才看到你的回答,非常抱歉!我将进行测试并告诉你结果。感谢你的回答。 - hveiga
2
很高兴听到这个消息。顺便说一下,我建议您升级到log4j-2.0-rc2和lmax disruptor 3.2.1。 - Remko Popma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接