日志处理是一个正式项目必备的功能,日志要能够根据时间、类型等要素,根据指定格式来保存指定的日志,方便我们观察程序运行情况、定位程序bug。
SpringBoot中推荐使用Logback日志框架。
本节示例项目在https://github.com/laolunsi/spring-boot-examples
slf4j:一个针对各类Java日志框架的统一facade抽象。
java常见日志框架:java.util.logging, log4j, logback, commons-logging
logback是log4j的作者开发的新一代日志框架,目前应用最广泛。SpringBoot默认使用logback,默认INFO级别
Logback:
日志加载顺序:logback.xml -> application.properties -> logback-spring.xml
一、日志级别
log4j定义的日志级别:debug/info/warn/error/fatal
warn,潜在错误;error,错误,可能导致程序退出;fatal,严重错误,程序会退出
还有两个特殊的级别:OFF-最高级别,ALL-最低级别
log4j建议仅使用debug/info/warn/error四个级别
日志级别:ERROR -> WARN -> INFO -> DEBUG
如配置日志级别为INFO,则INFO及以上级别的日志会输出,而比INFO级别低的日志(debug日志)不会被输出。
二、SpringBoot引入logger
直接引入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.1.11.RELEASE</version>
<scope>compile</scope>
</dependency>
间接引入:
引入spring-boot-starter,会自动引入spring-boot-starter-logging
引入spring-boot-starter-web,会自动引入spring-boot-starter
三、通过springboot配置文件配置logback
配置输出日志到文件:
logging:
file: logback-demo.log # 输出到项目目录下
默认是叠加输出,即每次启动项目不会删除之前的日志文件,也不会将当前使用的日志文件清空,而是在下面另起一行。
日志级别:logging.level.*: level-name
*指包名或日志名,日志名如root,表示系统日志
level-name指日志级别,常用debug/info/warn/error
比如:
logging:
level:
com.example.logbackdemo: debug # 指定包下日志以debug级别输出
#root: warn # root日志以warn级别输出,不要用debug级别!!---会卡的!
四、通过XMl文件自定义logback配置
上面的配置确实将日志保存到文件中,但是对于实际项目来说用处不大。
比如:日志文件非常庞大,每天产生的日志大小在数百MB,单个文件能处理么?日志需要分类型进行保存怎么办呢?定制日志格式怎么办呢?
这些都是问题。
幸好,包括logback在内的日志框架大多提供了配置文件功能,最常见的是使用xml文件进行配置。
日志框架默认配置文件:
- Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
- Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
- Log4j2:log4j2-spring.xml, log4j2.xml
- JDK (Java Util Logging):logging.properties
日志加载顺序:logback.xml -> application.properties -> logback-spring.xml
logback框架下:
建议使用logback-spring.xml,也可以在application中通过logging.config=classpath:xxx.xml来指定配置文件。
示例:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<contextName>logback-spring-demo-dev</contextName>
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
<property name="pattern-color" value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{50}) - %highlight(%msg) %n"/>
<property name="LOG_HOME" value="logs"/>
<!-- 控制台输出 -->
<appender name