如何让Spring Boot使用log4j.xml配置文件?

8

我有一个简单的Spring Boot应用程序,可以构建成jar文件。在src/main/resources/log4j.xml下有一个log4j.xml文件,内容如下(来自log4j文档的基本示例文件):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <!-- Pattern to output the caller's file name and line number -->
            <param name="ConversionPattern" value="%5p [%t] (%F:%L) - %m%n"/>
        </layout>
    </appender>
    <appender name="R" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="/tmp/logs/sample.log"/>
        <param name="MaxFileSize" value="100KB"/>
        <!-- Keep one backup file -->
        <param name="MaxBackupIndex" value="1"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%p %t %c - %m%n"/>
        </layout>
    </appender>
    <root>
        <priority value="debug"/>
        <appender-ref ref="stdout"/>
        <appender-ref ref="R"/>
    </root>
</log4j:configuration>

尽管log4j.xml文件位于jar包的根目录下,但仅限于日志输出到控制台(console),而不会创建/tmp/logs/sample.log文件。这表明log4j.xml文件被忽略了。

我认为文件位于jar包的根目录是正确的,那么还需要做什么才能使日志配置生效呢?

如果有所区别的话,该项目使用Gradle而非Maven。

2个回答

7
取决于你如何设置类路径。log4j是否绑定到类路径上的slf4j(如果只使用vanilla spring-boot-starter,它将不会绑定)?有一个spring-boot-starter-log4j和一个示例展示了如何使用它(在Maven中,但Gradle具有相同的功能)。
如果我是你,我会直接使用logback。
注:Spring Boot 1.4不支持log4j(仅支持log4j2)。不过,同样的地方有一个示例。

感谢提供示例项目参考。我仍然不清楚在该项目中如何以不同的方式定义类路径。 - user605331
请查看这里这里。我说过最好使用logback了吗? - Dave Syer
1
谢谢,我现在明白了。我不反对使用logback,但是在组织中尝试新事物时,如果新部分利用了人们已经知道的东西,那么更容易被接受。 - user605331
4
为了让其他阅读此帖的人受益,我最终使用了“project-report”插件来告诉我哪些依赖项引入了日志记录。结果发现,在我的情况下,spring-boot-starter-web和spring-boot-starter-actuator两者都引入了它。在这些依赖项上添加spring-boot-starter-logging的排除项就解决了问题。 - user605331
所有项目链接都已失效,@DaveSyer 能否请您更新这些链接,非常感谢。 - Hasson

3
如果我们同时使用Spring-boot并尝试显式地使用log4j进行日志记录,那么Spring-boot内置的日志记录将优先级更高,因此log4j的配置不会被读取。如上所述,在这种情况下的最佳解决方案是从以下两个Spring-boot依赖项中排除日志记录。
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

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