时间:2025-07-16 10:26
人气:
作者:admin
在项目中导入spring-boot-starter.jar依赖,它会传递 导入spring-boot-starter-logging.jar依赖,依赖关系如下图:

spring-boot-starter-logging.jar依赖三个jar包:
java的日志框架比较多,常见的包括:SLF4J、Log4j、Log4j2、Logback、common-logging(JCL)、java.util.logging(JUL)、JBoss Logging等,这些日志框架又分:
SpringBoot默认使用SLF4J+Logback组合,SLF4J作为日志门面(应用程序输出日志时应该面向改API),Logback作为日志实现。
由于SpringBoot要整合大量的第三方框架,这些框架可能使用JCL、Log4j、JUL等。因此SpringBoot提供对应的日志路由,将其他框架生成的日志信息统一路由给SLF4J处理。从上面依赖关系可以看出:
虽然SpringBoot默认采用Logback作为底层日志实现,但通过配置允许将底层日志实现改为其他框架。SpringBoot允许将Logback依赖排除出去,添加其他日志实现(比如log4j)的依赖。
需要注意的是:当吧SpringBoot应用部署到Web服务器或应用服务器上时,JUL生成的日志不会被路由到SpringBoot应用的日志中,这是为了避免将服务器或者服务器上的其他应用的日志也路由到SpringBoot的日志中,否则会造成日志混乱。
代码示例:控制器类
@RestController
public class HelloController
{
Logger logger = LoggerFactory.getLogger(this.getClass());
@GetMapping
public Map<String, Object> hello()
{
logger.trace("-------TRACE级别的日志-------");
logger.debug("-------DEBUG级别的日志-------");
logger.info("-------INFO级别的日志-------");
logger.warn("-------WARN级别的日志-------");
logger.error("-------ERROR级别的日志-------");
return Map.of("hello", "Hello");
}
}
日志级别主要分为(级别由低到高):
日志系统有一个规则:当日志的输出方法的级别高于或等于日志的设置级别,该日志才会实际输出。
比如日志级别设为info,当程序使用info()、warn()、error()输出时,日志才会实际输出;使用trace()、debug()输出的日志会被忽略。
因此,日志级别越高,输出日志就越精简,性能开销越小;日志级别越低,输出日志就越详细,性能开销越大。一般项目处于开发、测试、试运行阶段,日志级别设置的低;在项目实际运行阶段,日志级别设置的高。

由上图可知,SpringBoot默认的日志级别是Info。
SpringBoot输出的日志包括如下信息:
设置日志级别的几种方式:
需要注意的是,当启用trace或debug模式时,SpringBoot的核心日志(包括嵌入式容器、Hibernate和SpringBoot)被设为对应的级别,但是其他程序组件不会被设为对应级别。
例如:添加命令行参数: --trace 。 启动上面代码运行结果如下:

可见,程序组件本身的日志级别没有改变。
那么要设置程序组件的日志级别,要通过logging.level.
logging:
level:
# 将org.crazyit.app包及其子包下所有日志级别设为TRACE
org.crazyit.app: trace
运行结果如下

学会之后解决以下几个问题就很简单了。
SpringBoot允许通过spring.output.ansi.enabled属性设置是否用不同颜色来区分不同级别日志,该属性支持以下属性值:
如果要改变控制台的日志格式,可通过logging.pattern.console属性进行设置。其默认值是:
%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint}
%clr(${LOG_LEVEL_PATTERN:-%5p})
%clr(${PID:- }){magenta}
%clr(---){faint}
%clr([%15.15t]){faint}
%clr(%-40.40logger{39}){cyan}
%clr(????{faint}
%m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
上面配置由多个“%clr(输出内容){颜色值} ”片段组成,每个片段代表一个输出元素,其中{颜色值} 用于指定该片段的颜色。此处颜色值支持如下几个值:
如果不指定颜色之后,直接使用“%clr(输出内容)”,表面使用默认的颜色。
比如上面设置包含以下片段:
假如输出日志不要显示日期、时间,设置时去掉“%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} ”片段即可。
需要注意的是:logging.pattern.console属性仅当使用Logback日志实现时才有效。
要将日志输出到文件,设置如下两个属性之一:
使用logging.file或logging.path属性输出日志到文件
| logging.file.name | logging.file.path | 示例 | 描述 |
|---|---|---|---|
| 无 | 无 | 只输出到控制台 | |
| 指定文件 | 无 | my.log | 输出到特定文件,文件路径可以是绝对或相对路径 |
| 无 | 指定目录 | /f:/log | 写入指定路径下的spring.log文件,该路径可以是绝对或相对路径 |
SpringBoot默认只将info、warn、error三个级别的日志输出到文件。
当日志文件达到10MB时,会自动使用新文件。若要改变这个设置,对于Logback日志实现(SpringBoot默认),可直接使用application.properties(或application.yml)设置;对于其他日志实现,需要对应的日志设置文件来设置。比如log4j,需要使用log4j.xml设置。
Logback的日志设置
| 属性名称 | 描述 |
|---|---|
| logging.logback.rollingpolicy.file-name-pattern | 设置对日志归档的文件名模版 |
| logging.logback.rollingpolicy.clean-history-on-start | 应用启动时是否清除日志文档 |
| logging.logback.rollingpolicy.max-file-size | 日志文件归档之前的最大大小 |
| logging.logback.rollingpolicy.total-size-cap | 日志归档被删除之前所能容纳的最大大小 |
| logging.logback.rollingpolicy.max-history | 设置保留多少天的日志归档(默认7天) |
代码示例:控制器类org.crazyit.app.controller
@RestController
@Slf4j
public class HelloController
{
@GetMapping
public Map<String, Object> hello()
{
log.trace("-------TRACE级别的日志-------");
log.debug("-------DEBUG级别的日志-------");
log.info("-------INFO级别的日志-------");
log.warn("-------WARN级别的日志-------");
log.error("-------ERROR级别的日志-------");
return Map.of("hello", "Hello");
}
}
上面的控制器类使用@Slf4j注解修饰,里面的方法可直接使用 log.trace()等方法来输出日志,那这个log对象是从哪来的?
因为本例使用Lombok工具,这个工具专门通过各种注解来生成常用的代码,比如以下常用的注解:
为了在应用中使用Lombok,需要做一下两件事:
添加Lombok依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
为IDEA添加Lombok插件,通过主菜单FIle-》Settings-》Plugins-》搜索插件,然后安装即可。
代码示例:application-addition.yml
logging:
level:
# 将org.crazyit.app包及其子包下所有日志级别设为TRACE
org.crazyit.app: trace
file:
# 指定日志文件的输出目录,在应用的根目录下生成logs文件夹,该文件夹下生成默认文件名为spring.log
# path: logs/
# 指定日志文件,生成在应用的根目录下
name: my.log
日志组就是将多个包、类组合在一起,起一个名字,以后可直接对改组设置日志级别,对改组设置就相当于同时为改组内的所有包及其子包、类统一设置了日志级别。
代码示例:控制器类,为上面的控制器类再增加这个控制器类org.fkjava.app.controller
@RestController
@Slf4j
public class FkController
{
@GetMapping("/fk")
public Map<String, Object> hello()
{
log.trace("-------TRACE级别的日志-------");
log.debug("-------DEBUG级别的日志-------");
log.info("-------INFO级别的日志-------");
log.warn("-------WARN级别的日志-------");
log.error("-------ERROR级别的日志-------");
return Map.of("hello", "Hello");
}
}
代码示例:application-addition.yml
logging:
group:
# 将org.crazyit.app和org.fkjava.app两个包定义成fkapp组
fkapp: org.crazyit.app, org.fkjava.app
level:
# 将fkapp组对应的包及其子包的所有日志级别设为TRACE
fkapp: trace
如果想改变SpringBoot的底层日志实现(放弃Logback),则需要如下2步:
SpringBoot默认从类加载路径的根路径下加载日志框架的配置文件,也可通过logging.config属性来设置新的加载路径。
SpringBoot既可以根据底层依赖库自动选择合适的日志实现,也可通过org.springframework.boot.logging.LoggingSystem属性显式指定日志实现。属性值可以是LoggingSystem实现类的全限定类名(比如Log4J2LoggingSystem, LobbackLoggingSystem, JavaLoggingSystem等类的全限定类名);也可设置为none,也就彻底关闭SpringBoot的日志系统了。
注意:由于日志初始化会在ApplicantContext创建之前完成,因此不能通过SpringBoot的配置文件来配置logging.config、org.springframework.boot.logging.LoggingSystem等日志控制属性,只能通过系统属性来设置。
不同日志系统对应的配置文件
| 日志系统 | 配置文件 |
|---|---|
| Logback | logback-spring.xml, logback-spring.groovy, logback.xml或logback.groovy |
| Log4j2 | log4j2-spring.xml或log4j2.xml |
| JDK(JUL) | logging,properties |
注意:SpringBoot推荐使用带-spring的配置文件,比如Logback日志系统,使用 logback-spring.xml更好。此外尽量避免使用JUL日志系统,因此JUL的类加载机制会导致一些问题。
对日志进行定制的属性
| SpringBoot属性 | 系统属性 | 说明 |
|---|---|---|
| logging.exception-conversion-word | LOG_EXCEPTION_CONVERSION_WORD | 记录异常的转换字 |
| logging.file.name | LOG_FILE | 指定日志文件名 |
| logging.file.path | LOG_PATH | 指定日志输出路径,使用spring.log作为文件名 |
| logging.pattern.console | CONSOLE_LOG_PATTERN | 控制台日志的格式模板 |
| logging.pattern.dateformat | LOG_DATEFORMAT_PATTERN | 日期格式模板 |
| loggging.charset.console | CONSOLE_LOG_CHARSET | 输出控制台日志的字符集 |
| logging.pattern.file | FILE_LOG_PATTERN | 文件日志的格式模板,仅当日志输出到文件时才有效 |
| logging.charset.file | FILE_LOG_CHARSET | 文件日志所用的字符集,仅当日志输出到文件时才有效 |
| logging.pattern.level | LOG_LEVEL_PATTERN | 指定输出日志级别时使用的格式(默认为%5p) |
| PID | PID | 当前进程ID |
SpringBoot为logback提供了一些通用的配置文件,开发者只要导入这些配置文件,即可使用预定义的配置。这些文件位于org/springframework/boot/logging/logback/路径下,其中常用的有:
代码示例:logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 导入Logback通用的日志配置 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<!-- 定义日志文件 -->
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}