【问题标题】:Why aren't my classes logging, but Spring is logging (Spring boot with Maven and log4j)?为什么我的类没有记录,但 Spring 正在记录(使用 Maven 和 log4j 的 Spring 启动)?
【发布时间】:2017-06-05 22:01:45
【问题描述】:

近 2 天来,我一直在苦苦挣扎,尝试了我在此处几个问题的答案中找到的所有建议,但没有任何乐趣。 Spring 似乎记录得很好,但我的应用程序类没有记录任何内容。我正在使用 Spring boot 1.5.3 并构建一个使用 log4j 并在 tomcat 容器中运行的应用程序(因此它不需要 Spring 的嵌入式 tomcat 容器)。以下是我原来的 pom.xml 中的依赖项:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.3.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.jboss.logging</groupId>
                <artifactId>jboss-logging</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-validator</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
            <exclusion>
                <artifactId>log4j-over-slf4j</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
        </exclusions>
    </dependency>

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

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.7</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-web</artifactId>
        <version>2.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.7</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

我尝试了@M.Deinum 建议的解决方案,结果没有改变:Spring 成功登录,我的课程没有。这种情况下的 pom.xml 看起来像这样:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.3.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</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-log4j2</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

我的应用程序类路径的根目录中有以下配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="org.springframework.beans.factory" level="DEBUG"/>
        <Root level="DEBUG">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

我的 pom.xml 中当前的依赖项只是我尝试过的一系列排列中的最新一个,使用的代码取自 Spring Framework Reference 4.3.8.RELEASE 并在 stackoverflow 上回答了多个问题。

【问题讨论】:

  • 显示您的类级别日志记录示例以及 Logger 初始化
  • 删除所有排除项(仅排除 spring-boot-logging)并添加 spring-boot-starter-log4j2 而不是单独的依赖项(然后您将获得受支持和托管的版本。
  • @Zico 我不确定这是否能回答您的问题,但我的课程正在导入 org.apache.logging.log4j.LogManagerorg.apache.logging.log4j.Logger。类(都是单例 Spring bean)创建 private static final Logger logger = LogManager.getLogger(ThisClass.class); 并尝试通过调用 logger.debug("some text that never gets written to the log file") 来记录。

标签: java spring maven logging


【解决方案1】:

清理你的依赖,你排除了太多,包含了太多。 Spring Boot 对所有支持的日志记录包都有单独的启动器,只需使用它们。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</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-log4j2</artifactId>
    </dependency>

</dependencies>

这在reference guide中也有解释。

现在,当您要使用日志记录时,请确保通过 SLF4J API 而不是直接使用 Log4j2(因为这可能会触发非常早的初始化并干扰 Spring Boot 的设置)。

要创建可部署的战争,您需要修改一些范围为provided 的依赖项,而不是排除它们。 reference guide 中也对此进行了描述。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

【讨论】:

  • 我试过你描述的。请检查我对原始帖子的补充,它显示了我尝试过的修改后的 pom.xml,结果与以前相同。
  • 正如我的回答中提到的,使用 slf4j api 进行日志记录,而不是直接调用 log4j2 记录器。
猜你喜欢
  • 2010-12-20
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多