Springboot中如何使用日志框架logback和log4j2?

说明

在这个简短的教程中,我们将探索 Spring Boot 中可用的主要日志记录选项:logbacklog4j2

初始设置

使用 starters 时,默认使用 Logback 进行日志记录。
让我们首先创建一个 Spring Boot 模块。

  • 添加依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • 新建类
@RestController
public class LoggingController {

    Logger logger = LoggerFactory.getLogger(LoggingController.class);

    @RequestMapping("/")
    public String index() {
        logger.trace("A TRACE Message");
        logger.debug("A DEBUG Message");
        logger.info("An INFO Message");
        logger.warn("A WARN Message");
        logger.error("An ERROR Message");

        return "Howdy! Check out the Logs to see the output...";
    }
}

一旦我们加载了 Web 应用程序,我们就可以通过简单地访问http://localhost:8080/来触发这些日志记录行。

Spring Boot 使用模式和 ANSI 颜色对其进行预配置,以使标准输出更具可读性。
现在让我们运行应用程序并访问http://localhost:8080/页面,看看控制台中发生了什么。
在这里插入图片描述
我们可以看到,Logger 的默认日志级别预设为 INFO,这意味着TRACE和DEBUG消息是不可见的。

为了在不更改配置的情况下激活它们,我们可以在命令行上传递–debug或–trace参数:

java -jar target/spring-boot-logging-0.0.1-SNAPSHOT.jar --trace

日志级别

Spring Boot 还允许我们通过环境变量访问更细粒度的日志级别设置。有几种方法可以实现这一点。

首先,我们可以在 VM 选项中设置日志记录级别:

-Dlogging.level.org.springframework=TRACE 
-Dlogging.level.com.test.java=TRACE

或者,如果我们使用 Maven,我们可以 通过命令行定义我们的日志设置:

mvn spring-boot:run 
  -Dspring-boot.run.arguments=--logging.level.org.springframework=TRACE,--logging.level.com.test.java=TRACE

使用 Gradle 时,我们可以通过命令行传递日志设置。这将需要设置bootRun任务。

完成后,我们运行应用程序:

./gradlew bootRun -Pargs=--logging.level.org.springframework=TRACE,--logging.level.com.test.java=TRACE

如果我们想永久更改详细程度,我们可以在application.properties文件中这样做,如下所述:

logging.level.root=WARN
logging.level.com.baeldung=TRACE

最后,我们可以使用我们的日志框架配置文件永久更改日志级别。

我们提到 Spring Boot Starter 默认使用 Logback。让我们看看如何定义一个 Logback 配置文件的片段,我们在其中为两个单独的包设置级别:

<logger name="org.springframework" level="INFO" />
<logger name="com.test.java" level="INFO" />

请记住,如果 使用上述不同选项多次定义包的日志级别,但使用不同的日志级别,将使用最低级别。

因此,如果我们同时使用 Logback、Spring Boot 和环境变量设置日志级别,那么日志级别将是TRACE,因为它是请求级别中最低的。

配置logback

尽管默认配置也挺好用,但无法满足我们实际企业对于生产环境中的日志记录。
比如:自定义的日志格式、日志输出基本、日志文件保存策略等等,为此我们需要自定义一份日志设置文件。
Spring Boot 启动时候会去类路径下按顺序查找以下配置文件:

  • logback-spring.xml
  • logback.xml
  • logback-spring.groovy
  • logback.groovy

此处,我们在resources目录下新建logback-spring.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <property name="LOGS" value="./logs" />

    <appender name="Console"
              class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %green(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
            </Pattern>
        </layout>
    </appender>

    <appender name="RollingFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOGS}/spring-boot-logger.log</file>
        <encoder
                class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
        </encoder>

        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily and when the file reaches 10 MegaBytes -->
            <fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <!-- LOG everything at INFO level -->
    <root level="info">
        <appender-ref ref="RollingFile" />
        <appender-ref ref="Console" />
    </root>

    <!-- LOG "com.baeldung*" at TRACE level -->
    <logger name="com.test.java" level="trace" additivity="false">
        <appender-ref ref="RollingFile" />
        <appender-ref ref="Console" />
    </logger>

</configuration>

再次启动项目访问后,查看输出如下:
在这里插入图片描述
正如我们所看到的,它现在记录了TRACE和DEBUG消息,并且整个控制台模式在文本和色彩上都与以前不同。

它现在还登录在当前路径下创建的/logs文件夹中的文件,并通过滚动策略将其存档。

使用log4j2

除了使用默认的logback我们还推荐使用log4j2,从先进性上面来讲log4j2更胜一筹。
首先我们需要调整以下pom依赖:

<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>

此时,我们需要在类路径中放置一个配置文件,名称可以是下面这样:

  • log4j2-spring.xml
  • log4j2.xml

我们将通过 Log4j2(通过 SLF4J)打印,无需进一步修改。
让我们编写一个简单的log4j2-spring.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <property name="LOGS" value="./logs" />

    <appender name="Console"
              class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %green(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
            </Pattern>
        </layout>
    </appender>

    <appender name="RollingFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOGS}/spring-boot-logger.log</file>
        <encoder
                class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
        </encoder>

        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily and when the file reaches 10 MegaBytes -->
            <fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <!-- LOG everything at INFO level -->
    <root level="info">
        <appender-ref ref="RollingFile" />
        <appender-ref ref="Console" />
    </root>

    <!-- LOG "com.baeldung*" at TRACE level -->
    <logger name="com.test.java" level="trace" additivity="false">
        <appender-ref ref="RollingFile" />
        <appender-ref ref="Console" />
    </logger>

</configuration>
  • 再编写一个测试类:
@RestController
@Slf4j
public class LombokLoggingController {

    @RequestMapping("/dolog4j")
    public String index(){
        log.trace("A TRACE Message");
        log.debug("A DEBUG Message");
        log.info("An INFO Message");
        log.warn("A WARN Message");
        log.error("An ERROR Message");

        return "Howdy! Check out the Logs to see the output...";
    }
}

启动程序访问后的日志输出如下:
在这里插入图片描述

posted @ 2022-03-16 13:47  一锤子技术员  阅读(11)  评论(0编辑  收藏  举报  来源