引言
日志记录是任何应用程序开发过程中的一个重要部分,它帮助开发人员了解应用程序的运行状态、诊断问题并进行有效的错误跟踪。SpringBoot3
提供了一个强大的日志管理系统,支持各种日志框架,并提供了简单的配置方法。本教程将介绍 SpringBoot3
中的日志系统,包括默认配置、如何自定义日志设置以及如何使用不同的日志框架。
默认日志配置
日志门面
SpringBoot3
默认是使用 slf4j + Logback
作为默认的日志门面和实现,但也支持其他日志系统,如 Log4j2
、JUL (Java Util Logging)
,这是通过所谓的日志门面实现的,开发者可以根据自己的需求选择合适的日志实现框架进行配置。
在 SpringBoot
中,日志门面是指通过引入日志框架的抽象层来统一管理应用程序中的日志输出。SpringBoot
内置了 Commons Logging
、SLF4J
或 jboss-logging
作为日志抽象层(门面),具体的实现可以是 Log4j
、JUL
、Log4j2
或 Logback
。
通过使用日志门面,开发者可以在不改变应用程序代码的情况下,灵活地切换和配置不同的日志实现框架,从而更好地适应不同的部署环境和需求。这样一来,开发者可以更方便地进行日志输出的管理和调整,提高应用程序的可维护性和扩展性。
默认配置的实现
以导入 spring-boot-starter-web
为例,它会导入 spring-boot-starter
。
spring-boot-starter
直接引入了 spring-boot-starter-logging
日志相关配配置(而不是通过 XxxAutoConfiguration
,这是因为 SpringBoot
启动的时候就要用到日志,需要内置进 SpringBoot
中)。
日志相关文件在这里,可以看到相关的默认配置文件:
另外 spring-boot
包 additional-spring-configuration-metadata.json
文件下会有日志相关一些默认值的格式,这些默认值可以通过配置文件进行修改。
自定义日志配置
虽然默认配置对于开发时足够使用,但在生产环境中,你可能需要自定义日志设置,例如更改日志级别、格式或输出目的地。
日志级别
默认日志级别:
-
由低到高:
ALL,TRACE, DEBUG, INFO, WARN, ERROR,FATAL,OFF
; -
- 只会打印指定级别及以上级别的日志
- ALL:打印所有日志
- TRACE:追踪框架详细流程日志,一般不使用
- DEBUG:开发调试细节日志
- INFO:关键、感兴趣信息日志
- WARN:警告但不是错误的信息日志,比如:版本过时
- ERROR:业务错误日志,比如出现各种异常
- FATAL:致命错误日志,比如
jvm
系统崩溃 - OFF:关闭所有日志记录
-
不指定级别的所有类,都使用 root 指定的级别作为默认级别
-
SpringBoot3
日志默认级别是INFO
你可以在 application.yml
或 application.properties
文件中设置不同包的日志级别:
logging:
level:
root: WARN
org.springframework.web: DEBUG
com.coderjia: INFO
这里,root
级别被设为 WARN
,Spring web
包日志级别设为 DEBUG
,而你自己的公司代码 com.coderjia
设为 INFO
级别。
日志分组
可以将相关的包分组在一起,统一进行日志级别配置配置。比如:Tomcat 相关的日志统一设置。
logging:
group:
tomcat: org.apache.catalina,org.apache.coyote,org.apache.tomcat
level:
root: debug
sql: debug
tomcat: info
web: info
以上将 org.apache.catalina,org.apache.coyote,org.apache.tomcat
分组为 tomcat
,并通过 logging.level.tomcat=info
将 tomcat
组日志级别设置为 info
。另外 SpringBoot
预定义两个组 sql
和 web
:
- web:org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans ;
- sql:org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener。
日志格式
默认日志格式如下:
2024-03-06T11:30:42.611+08:00 INFO 31412 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8083 (http) with context path ''
2024-03-06T11:30:42.618+08:00 INFO 31412 --- [ main] c.c.b.SpringBoot303LoggingApplication : Started SpringBoot303LoggingApplication in 1.602 seconds (process running for 2.442)
格式:
- 时间和日期:毫秒级精度
- 日志级别:
ERROR, WARN, INFO, DEBUG, or TRACE
- 进程 ID
- ---: 消息分割符
- 线程名: 使用
[]
包含 - Logger 名: 通常是产生日志的类名
- 消息: 日志记录的内容
默认值:可以参照 spring-boot
包additional-spring-configuration-metadata.json
文件中的 logging.pattern.console
项:
可修改为:
logging:
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{15} : %msg%n'
dateformat: '"yyyy-MM-dd HH:mm"'
logging.pattern.console
:定义输出的格式,logging.pattern.dateformat
: 定义输出日期格式。
2024-03-06 11:36:51 INFO [main] o.s.b.w.e.t.TomcatWebServer : Tomcat started on port 8083 (http) with context path ''
日志输出
默认情况下,日志输出到控制台。但你可以配置它输出到文件或同时输出到文件和控制台:
logging:
file:
name: my.log
path: /var/logs
这将会在 /var/logs
路径下创建一个 my.log
文件记录日志,logging.file.name=/var/log/my.log
也可以即定义路径又定义名称。
日志归档
如果使用 SpringBoot
默认的 Logback
框架,可以通过 application.properties/yaml
文件指定日志归档文件名和滚动规则,如果是其他日志系统,需要自行配置(添加 log4j2.xml
或 log4j2-spring.xml
)。
logging:
logback:
rollingpolicy:
file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz)
max-file-size: 12MB
配置项如下:
配置项 | 描述 |
---|---|
logging.logback.rollingpolicy.file-name-pattern | 日志存档的文件名格式(默认值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz) |
logging.logback.rollingpolicy.clean-history-on-start | 应用启动时是否清除以前存档(默认值:false) |
logging.logback.rollingpolicy.max-file-size | 存档前,每个日志文件的最大大小(默认值:10MB) |
logging.logback.rollingpolicy.total-size-cap | 日志文件被删除之前,可以容纳的最大大小(默认值:0B)。设置 1GB 则磁盘存储超过 1GB 日志后就会删除旧日志文件 |
logging.logback.rollingpolicy.max-history | 日志文件保存的最大天数(默认值:7). |
自定义 Logback 配置
对于更高级的配置,例如滚动策略、过滤器等,你可以通过提供自定义的 Logback
配置文件来实现。创建一个名为 logback-spring.xml
的文件,并放在 src/main/resources
目录下:
<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>
</configuration>
这个自定义配置将日志输出格式修改为指定的模式,另外建议自定义配置,配置文件名加上 xxx-spring.xml
(例如,logback-spring.xml
而不是 logback.xml
),这样更容易被Spring。
切换日志框架
如果你更喜欢使用 Log4j2
而不是 Logback
,你可以轻松切换。首先,排除 SpringBoot
的默认日志启动器,然后添加 Log4j2
的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
然后,你可以像以前一样配置 Log4j2
,Spring Boot
会自动识别并应用 Log4j2
的配置。此外如果引入的依赖中自带日志和当前 SpringBoot
默认日志不一致,也可以排查掉依赖中的日志组件。
日志使用
方式一:LoggerFactory 获取Logger对象
在需要打日志的类中定义。
@SpringBootApplication
public class SpringBoot303LoggingApplication {
private static Logger log = LoggerFactory.getLogger(SpringBoot303LoggingApplication.class);
public static void main(String[] args) {
SpringApplication.run(SpringBoot303LoggingApplication.class, args);
log.info("启动完成");
}
}
方式二:引入 lombok
使用
@Slf4j
注解可以自动生成一个log
对象,省去了手动获取Logger
对象的步骤,简化了代码编写。
导入依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>compile</scope>
</dependency>
添加注接 @Slf4j
:
@Slf4j
@SpringBootApplication
public class SpringBoot303LoggingApplication {
// private static Logger log = LoggerFactory.getLogger(SpringBoot303LoggingApplication.class);
public static void main(String[] args) {
SpringApplication.run(SpringBoot303LoggingApplication.class, args);
log.info("启动完成");
}
}
总结
SpringBoot3
提供了一个灵活且强大的日志系统,支持多种日志框架和丰富的配置选项。通过适当的配置,你可以轻松管理和监控你的应用程序日志,帮助你更有效地开发和维护你的 SpringBoot
应用。理解和掌握 SpringBoot
中的日志配置,将使你能够更好地控制应用程序的日志记录行为。