前言:
Spring Boot 日志记录是应用程序开发中的重要部分,它有助于开发者跟踪应用程序的运行状态、调试问题和收集运行时的信息;在开发中,我们经常使用 System.out.println()来打印一些信息,这样是非常不好方法,因为大量的使用 System.out会增加资源的消耗。我们实际项目中使用的是 slf4j 的 logback 来输出日志,效率挺高的,Spring Boot 提供了一套日志系统,logback 是最优的选择。
一:slf4j 介绍
在Spring Boot应用程序中使用SLF4J(Simple Logging Facade for Java)进行日志记录是一种常见的做法。SLF4J本身是一个日志门面,它允许你在应用程序中使用统一的日志接口,而不必关心底层的日志实现(如Logback、Log4j等)。Spring Boot默认使用Logback作为日志实现。
二:日志级别
日志级别用于控制日志输出的详细程度。Spring Boot 支持的日志级别包括 TRACE、DEBUG、INFO、WARN、ERROR 和 FATAL。每个级别都表示了不同的日志重要性和详细程度。例如:
- TRACE:最详细的日志级别,通常用于跟踪程序的执行流程。
- DEBUG:提供调试信息的日志级别,通常用于开发过程中定位问题。
- INFO:提供应用程序运行时的关键信息的日志级别。
- WARN:表示潜在的有害情况的日志级别。
- ERROR:表示错误或异常情况的日志级别。
- FATAL:表示非常严重的错误,通常会导致应用程序的终止。
三:日志配置
在 Spring Boot 中,可以通过多种方式进行日志配置:
application.yml 文件:可以在这些配置文件中设置日志级别、输出格式和日志文件路径等.
或者在 application.yml
中:
# 日志配置
logging:
level:
com.qzh.demo: debug
org.springframework: warn
tech.powerjob.worker.background: warn
config: classpath:logback.xml
logging.config:是用来指定项目启动的时候,读取哪个配置文件,这里指定的是日志配置文件是根路径下的logback.xml文件,关于日志的相关配置信息,都放在logback.xml文件中了。logging.level:是用来指定具体的 mapper 中日志的输出级别,上面的配置表示 com.qzh.demo包下日志输出级别为 debug。
添加依赖
spring Boot Starter已经包含了Logback,通常不需要添加额外的依赖。使用其他日志框架(如Log4j2),需要在pom.xml
中排除Logback并添加所需的日志框架依赖。
使用Logback(默认)
通常不需要添加额外的依赖,因为Spring Boot Starter已经包含了Logback。
使用Log4j2
<dependencies>
<!-- Spring Boot Starter (excluding Logback) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Spring Boot Starter for Log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
2.配置日志记录
使用Logback
默认情况下,Spring Boot会在src/main/resources
目录下查找名为logback.xml
的配置文件。以下是一个简单的Logback配置示例:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT" />
</root>
<logger name="com.example.demo" level="debug" />
</configuration>
使用Log4j2
如果使用Log4j2,Spring Boot会在src/main/resources
目录下查找名为log4j2.xml
的配置文件。以下是一个简单的Log4j2配置示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
<Logger name="com.example.demo" level="debug" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
</Loggers>
</Configuration>
四:日志输出格式
日志输出格式可以通过配置文件进行设置。常见的格式包括时间戳、日志级别、线程名称、类名、日志消息等。通过统一的输出格式,可以方便地查看和分析日志。
logback.xml 配置文件解析:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="log.path" value="./logs"/>
<property name="console.log.pattern"
value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${console.log.pattern}</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<!-- 控制台输出 -->
<appender name="file_console" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-console.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-console.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大 1天 -->
<maxHistory>1</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
</filter>
</appender>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file_console" />
</root>
</configuration>
在上面logback.xml`中,我们可以定义日志输出的格式、路径、控制台输出格式、文件大小、保存时长等等。下面来分析一下:
1.定义日志输出格式和存储路径:
<property name="log.path" value="./logs"/>
<property name="console.log.pattern"
value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>
我们来看一下这个定义的含义:首先定义一个格式,命名为 "log.pattern",该格式中 `%date` 表示日期,`%thread` 表示线程名,`%-5level` 表示级别从左显示5个字符宽度,`%logger{36}` 表示 logger 名字最长36个字符,`%msg` 表示日志消息,`%n` 是换行符。
然后再定义一下名为 "log.path" 文件路径,日志都会存储在该路径下,不管是 windows 系统还是 Linux 系统,日志存储的路径必须要是绝对路径。
2. 定义控制台输出
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${console.log.pattern}</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
使用 `<appender>` 节点设置个控制台输出(`class="ch.qos.logback.core.ConsoleAppender"`)的配置,定义为 "console"。使用上面定义好的输出格式(console.log.pattern)来输出,使用 `${}` 引用进来即可。
3. 定义日志文件的相关参数
<!-- 控制台输出 -->
<appender name="file_console" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-console.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-console.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大 1天 -->
<maxHistory>1</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
</filter>
</appender>
使用 `<appender>` 定义一个名为 "file_console" 的文件配置,主要是配置日志文件保存的时间、单个日志文件存储的大小、以及文件保存的路径和日志的输出格式。
4. 定义日志输出级别
<!--系统操作日志-->
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file_console" />
</root>
有了上面那些定义后,最后我们使用 `<logger>` 来定义一下项目中默认的日志输出级别,这里定义级别为 INFO,然后针对 INFO 级别的日志,使用 `<root>` 引用上面定义好的控制台日志输出和日志文件的参数。这样 logback.xml 文件中的配置就设置完了。
五:演示效果
小结:
综上所述,在Spring Boot项目中,使用Logback进行日志记录是非常常见和推荐的做法,Spring Boot 日志记录是一个灵活且强大的功能,可以帮助开发者更好地跟踪和管理应用程序的运行状态。通过合理的配置和使用,可以提高应用程序的可靠性和可维护性。