SpringBoot日志配置
规范:项目开发不应该编写System.out.println()的语句,而应该日志记录信息。
日志门面技术 | 日志实现 |
---|---|
JCL(Jakarta Commons Logging) | Log4j、 JUL(java.util.logging) |
SLF4j(Simple Logging Facade for Java) | Log4j2、Logback |
jboss-logging |
简介
1、Spring使用commons-logging作为内部日志,但底层日志实现是开放的。可对接其他日志框架。
spring5及以后commons-logging被spring自动导入
2、支持jul, log4j2, logback。SpringBoot提供了默认的控制台输出配置,也可以配置输出为文件。
3、logback是默认使用的
4、虽然日志框架很多,但我们可以使用SpringBoot的默认配置。
SpringBoot默认日志配置
1、每个
starter
场景,都会导入一个核心场景spring-boot-starter
2、核心场景引入了日志的所有功能
spring-boot-starter-logging
3、默认使用了
logback+slf4j
组合作为默认底层日志。4、日志是系统启动就要用,
xxxAutoConfuration
是系统启动好了以后放好的组件。5、日志是通过监听器机制配置好的,
ApplicationListener
6、日志所有的配置都可以通过修改配置文件实现。以
logging
开始的所有配置。
日志格式
默认输出格式
时间和日期:毫秒级精度
日志级别:ERROR、WARN、INFO、DEBUG、TRACE
进程ID
---:消息分割符
线程名:使用[]包含
Logger名:通常是产生日志的类别
消息:日志记录的内容
默认值可参照spring-boot
包additional-spring-configuration-metadata.json
文件。
注意:logback没有FATAL级别,对应的是ERROR,在控制台使用jps能够查看所有进程。
日志使用
方式一
java
@RestController
public class HelloController {
Logger logger = LoggerFactory.getLogger(HelloController.class);
//Logger logger = LoggerFactory.getLogger(getClass())
@GetMapping("/hello")
public String hello(){
logger.info("test log");
return "hello";
}
}
方式二
java
@Slf4j
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
log.info("need lombok dependency");
return "hello";
}
}
日志级别
由低到高:ALL、TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF
只会打印指定级别及以上级别的日志
。
日志级别 | 含义 |
---|---|
ALL | 打印所有日志 |
TRACE | 追踪框架详细流程日志,一般不使用 |
DEBUG | 开发调试细节日志 |
INFO | 关键、感兴趣信息日志 |
WARN | 警告但不是错误的信息日志,比如:版本过时 |
ERROR | 业务错误日志,比如出现各种异常 |
FATAL | 致命错误日志,比如JVM系统崩溃 |
OFF | 关闭所有日志记录 |
不指定级别的所有类,都使用root指定的级别作为默认级别,SpringBoot日志默认级别是INFO。
测试
java
@Slf4j
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
log.trace("trace 日志.....");
log.debug("debug 日志.....");
log.info("info 日志.....");
log.warn("warn 日志.....");
log.error("error 日志.....");
return "hello";
}
}
由于SpringBoot默认的日志级别是INFO,所以只有INFO级别及更高级别的日志信息才会被输出到日志中,而TRACE、DEBUG级别的日志信息将被忽略。
日志配置
1、在application.properties/yml
中配置logging.level.<logger-name>=<level>
指定日志级别,logger-name可以是某一个类
2、level
可取值范围:TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF
,定义在LogLevel中
3、root的logger-name
叫root
,可以配置logging.level.root=warn
,代表所有未指定日志级别都使用root的warn级别
日志输出参数
java
@Slf4j
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(String a, String b){
log.info("info 日志.....参数a:{} b:{}",a, b);
return "hello";
}
}
日志分组
将相关的
logger
分组在一起,统一配置。如:Tomcat相关的日志统一设置。
SpringBoot预定义两个开箱即用的组
name | Loggers |
---|---|
web | org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.web.servlet.ServletContextInitializerBeans |
sql | org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener |
文件输出
SpringBoot默认只把日志写在控制台,如果想额外记录到文件,可以在
application.properties
中添加logging.file.name
orlogging.path
配置项。
logging.file.name | logging.file.path | 示例 | 效果 |
---|---|---|---|
未指定 | 未指定 | 仅控制台输出 | |
指定 | 未指定 | my.log | 写入指定文件。可以加路径 |
未指定 | 指定 | /var/log | 写入指定目录,文件名为spring.log |
指定 | 指定 | 以logging.file.name 为准 |
properties
#指定日志文件的路径,日志文件默认名叫spring.log
#logging.file.path=
#指定日志文件的名称
#1、只写名字、就生成当前项目相同位置的demo.log
#logging.file.name=demo.log
#2、写名字+路径:生成到指定位置的指定文件
logging.file.name=D://demo.log
当path配置项和name配置项同时存在的时候,以name为准。
文件归档与滚动切割
归档
:每天的日志单独存到一个文档
切割
:每个文件10MB,超过大小切割成另外一个文件。
1、每天的日志因该独立分割出来存档。如果使用logback
(SpringBoot默认整合),可以通过application.properties/yml
文件指定日志滚动规则。
2、如果是其他日志系统,需要自行配置(添加log4j2.xml或log4j2-spring.xml)
3、支持的滚动规则设置如下
配置项 | 描述 |
---|---|
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) |
properties
logging.logback.rollingpolicy.file-name-pattern=$(LOG_FILE).%d(yyyy-MM-dd).%i.gz)
自定义配置
通常我们配置
application.properties
就够平常使用,当然也可以自定义。如:
日志系统 | 自定义 |
---|---|
Logback | logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy |
Log4j2 | log4j2-spring.xml,log4j2.xml |
JDK(Java Util Logging) | logging.properties |
建议在日志配置文件中使用-spring
变量,而不是xxx.xml
,如果不加-spring
spring不能完全控制。
切换日志组合
使用maven的就近原则。
xml
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
最佳应用场景
1、导入热更新(Hot Reload)和第三方框架后,由于Spring Boot底层已经管理好了日志,因此需要排除这些框架的日志包。
2、修改
application.properties
配置文件,调整日志的所有行为。如果不够,可以编写日志框架,自己的配置文件放在类路径下就行,比如logback-spring.xml
,log4j2-spring.xml
3、如果需要对接专业日志系统,只需要把logback记录的日志灌倒kafka中间件,这和SpringBoot没关系,都是日志框架自己的配置,修改配置文件即可
4、业务中使用slf4j-api记录日志。不再需要System.out.pritln()