Spring Boot在所有内部日志中使用Commons Logging,但实现底层日志是开放的。在Spring Boot生态中,为Java Util Logging 、Log4J2 和Logback 所有这些常见的日志框架都提供自动配置组件Logger日志内容可以在控制台或文件中输出。在默认情况下,当我们使用各种情况时,Starter会用的Logback实现日志管理。
如何记日志
写日志的方式有很多,这里就不列出各种方式了,只说DD最常用的方法!
首先,在代码层面,我们不担心默认使用Logback还是Log4j,但直接使用:。
为什么不管具体用途?Logback还是Log4j你可以写代码吗?这是使用Slf4j好处,为什么?Slf4j?英文全称:Simple Logging Facade for Java,也就是说,简单的日志立面不是具体的日志解决方案,而是实际工作Logback或Log4j这样的日志框架。Slf4j是23种设计模式中门面模式的典型应用案例。通过Slf4j这种门面门面的抽象存在,让我们只依靠抽象的日志操作来编写代码,具体的实现将是Slf4j门面调用时委托具体实现。
例如,以下是一个简单的日志记录例子:
@Slf4j @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); log.error("Hello World"); log.warn("Hello World"); log.info("Hello World"); log.debug("Hello World"); log.trace("Hello World"); } }
注:我们在这里通过pom.xml
中引入了Lombok,然后使用@Slf4j
声明引入Slf4j的log
日志记录对象,然后你可以很容易地日志了。这个日志是怎么写控制台或者文件的?Spring Boot默认情况下,该项目引入了哪些具体的日志框架决定?Logback。
日志元素
启动任何一个Spring Boot在项目中,我们都可以在控制台上看到很多日志信息,比如以下日志:
日志的输出内容有7个元素,具体如下:
- 时间日期:精确到毫秒
- 日志级别:ERROR, WARN, INFO, DEBUG or TRACE
- 进程ID
- 分隔符:
---
实际标志的开始 - 包括方括号(可能会切断控制台输出)
- Logger名称:通常使用源代码的类名
- 日志内容
日志输出
在Spring Boot在应用默认输出到控制台,默认输出日志级别包括:ERROR
、WARN
和INFO
,我们可以帮助上面写的Hello World例子运行时,可以验证默认设置:
2021-12-28 17:37:25.578 INFO 65136 --- [ main] com.didispace.chapter81.Application : Started Application in 2.695 seconds (JVM running for 3.957) 2021-12-28 17:37:25.579 ERROR 65136 --- [ main] com.didispace.chapter81.Application : Hello World 2021-12-28 17:37:25.579 WARN 65136 --- [ main] com.didispace.chapter81.Application : Hello World 2021-12-28 17:37:25.579 INFO 65136 --- [ main] com.didispace.chapter81.Application : Hello World
我们可以通过两种方式切换到DEBUG
级别:
:加入操作命令后--debug
标志,如:$ java -jar myapp.jar --debug
:在配置文件application.properties
中配置debug=true
这里开启的DEBUG只影响核心的日志Logger,包括嵌入式容器,hibernate、spring等这些框架层面的会输出更多内容,但是你自己应用的日志并不会输出为DEBUG级别,从下面的截图中我们就可以看到,我们自己编写的debug级别的Hello World没有输出。
日志配置
以下是一些常用的日志配置,以帮助我们更好地管理日志内容。
多彩输出
假如你的终端支持ANSI,设置彩色输出将使日志更可读。application.properties
中设置spring.output.ansi.enabled
支持参数有三种选项:
- NEVER:禁用ANSI-colored输出
- DETECT:检查终端是否支持ANSI,是的,使用彩色输出(默认项)
- ALWAYS:总是使用ANSI-colored格式输出,如果终端不支持,会有很多干扰信息,不建议使用
注意:Spring Boot 1.x默认值为NEVER,2.x之后默认为DETECT,所以看看我们上面的截图,默认已经有颜色了。所以如果是的话Spring Boot 2.x对于版本用户,这基本上不需要修改。
文件输出
Spring Boot默认配置只输出到控制台,不记录在文件中,但在使用生产环境时通常需要以文件的形式记录。
要增加文件输出,需要配置文件application.properties
配置几个参数,如:
logging.file.name=run.log logging.file.path=./
logging.file.name
:设置文件名logging.file.path
:设置文件路径
注:跟1.x版本不同,1.x分别对应的参数为
logging.file
和logging.path
。
文件滚动
在文件中输出日志显然是不合适的。任何日志框架都将为此准备日志文件的滚动配置。由于本文将默认配置,因此Logback具体配置如下:
logging.logback.rollingpolicy.file-name-pattern
:文件名模式用于创建日志档案。logging.logback.rollingpolicy.clean-history-on-start
:默认情况下,应用程序启动时是否清理日志归档false,不清理logging.logback.rollingpolicy.max-history
:默认保留的最大归档日志文件数量为7份logging.logback.rollingpolicy.max-file-size
:归档前日志文件的最大尺寸默认为10MBlogging.logback.rollingpolicy.total-size-cap
:删除前日志档案的最大容量默认为0B
级别控制
若要对每一个Logger做一些简单的输出级别控制,只需要application.properties
可完成中间配置。
配置格式:logging.level.*=LEVEL
-
logging.level:日志级别控制前缀,
*
为包名或Logger名 LEVEL
:选项TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
举例:
logging.level.com.didispace=DEBUG
:com.didispace
包下所有class以DEBUG级别输出logging.level.root=WARN
:root日志以WARN级别输出
做了这样的配置之后,可以再执行下上面的程序,原本debug级别的Hello World就可以被成功输出了。
自定义日志配置">自定义日志配置
由于日志服务一般都在ApplicationContext创建前就初始化了,它并不是必须通过Spring的配置文件控制。因此通过系统属性和传统的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。
根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:
- Logback:
logback-spring.xml
,logback-spring.groovy
,logback.xml
,logback.groovy
- Log4j2:
log4j2-spring.xml
,log4j2.xml
- JDK (Java Util Logging):
logging.properties
自定义输出格式
在Spring Boot中可以通过在application.properties
配置如下参数控制输出格式:
- logging.pattern.console:定义输出到控制台的样式(不支持JDK Logger)
- logging.pattern.file:定义输出到文件的样式(不支持JDK Logger)
好了,今天的学习就到这里!如果您学习过程中如遇困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!汇总页面《Spring Boot基础教程》可以点击直达!,欢迎收藏与转发支持!
代码示例
本文的完整工程可以查看下面仓库中2.x
目录下的chapter8-1
工程:
- Github:https://github.com/dyc87112/SpringBoot-Learning/
- Gitee:https://gitee.com/didispace/SpringBoot-Learning/
欢迎关注我的公众号:程序猿DD。前沿技术早知道,弯道超车有希望!积累超车资本,从关注DD开始!