锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Spring Boot 2.x的默认日志管理与Logback配置详解

时间:2023-10-16 17:07:00 dyc1型气压传感器

前沿技术早就知道了,弯道超车有希望

积累超车资本,关注DD开始

Spring Boot在所有内部日志中使用Commons Logging,但实现底层日志是开放的。在Spring Boot生态中,为Java Util Logging 、Log4J2 和Logback 所有这些常见的日志框架都提供自动配置组件Logger日志内容可以在控制台或文件中输出。在默认情况下,当我们使用各种情况时,Starter的时候,会使用Logback实现日志管理。

如何记日志

写日志的方式有很多,这里就不列出各种方式了,只说DD最常用的方法!

首先,在代码层面,我们不担心默认使用Logback还是Log4j,但直接使用:Slf4j

为什么不管具体用途?Logback还是Log4j你可以写代码吗?这是使用Slf4j好处!那么什么是Slf4j?英文全称:Simple Logging Facade for Java,也就是说,简单的日志立面不是具体的日志解决方案,而是实际工作Logback或Log4j这样的日志框架。Slf4j通过23种设计模式中门面模式的典型应用案例Slf4j这样的门面抽象,让我们在写代码记录日志的时候,只依靠这个抽象的操作,具体的实现会在Slf4j在调用门面时,委托给实现日志记录的具体框架。

例如,以下是一个简单的使用Slf4j记录日志例子:

@Slf4j @SpringBootApplication publicclassApplication{  publicstaticvoidmain(String[]args){ SpringApplication.run(Application.class,args);  log.error("HelloWorld"); log.warn("HelloWorld"); log.info("HelloWorld"); log.debug("HelloWorld"); log.trace("HelloWorld"); }  }

注:我们在这里通过pom.xml中引入了Lombok,然后使用@Slf4j声明引入Slf4j的log日志记录对象,然后你可以很容易地日志了。这个日志是怎么写控制台或者文件的?Spring Boot默认情况下,该项目引入了哪些具体的日志框架决定?Logback。

日志元素

启动任何一个Spring Boot在项目中,我们都可以在控制台上看到很多日志信息,比如以下日志:

9cafcba871e2c9332f6496f55fb21c05.png

日志的输出内容有7个元素,具体如下:

  1. 时间日期:精确到毫秒

  2. 日志级别:ERROR, WARN, INFO, DEBUG or TRACE

  3. 进程ID

  4. 分隔符:---实际标志的开始

  5. 包括方括号(可能会切断控制台输出)

  6. Logger名称:通常使用源代码的类名

  7. 日志内容

日志输出

在Spring Boot在应用默认输出到控制台,默认输出日志级别包括:ERRORWARNINFO,我们可以帮助上面写的Hello World例子运行时,可以验证默认设置:

2021-12-2817:37:25.578INFO65136---[main]com.didispace.chapter81.Application:StartedApplicationin2.695seconds(JVMrunningfor3.957) 2021-12-2817:37:25.579ERROR65136---[main]com.didispace.chapter81.Application:HelloWorld 2021-12-2817:37:25.579WARN65136---[main]com.didispace.chapter81.Application:HelloWorld 2021-12-2817:37:25.579INFO65136---[main]com.didispace.chapter81.Application:HelloWorld

开启DEBUG日志

我们可以通过两种方式切换至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.filelogging.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:归档前日志文件的最大尺寸,默认为10MB

  • logging.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=DEBUGcom.didispace包下所有class以DEBUG级别输出

  • logging.level.root=WARN:root日志以WARN级别输出

做了这样的配置之后,可以再执行下上面的程序,原本debug级别的Hello World就可以被成功输出了。

logging.level.com.didispace=DEBUG

自定义日志配置

由于日志服务一般都在ApplicationContext创建前就初始化了,它并不是必须通过Spring的配置文件控制。因此通过系统属性和传统的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。

根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:

  • Logback:logback-spring.xmllogback-spring.groovylogback.xmllogback.groovy

  • Log4j2:log4j2-spring.xmllog4j2.xml

  • JDK (Java Util Logging):logging.properties

Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml

自定义输出格式

在Spring Boot中可以通过在application.properties配置如下参数控制输出格式:

  • logging.pattern.console:定义输出到控制台的样式(不支持JDK Logger)

  • logging.pattern.file:定义输出到文件的样式(不支持JDK Logger)

好了,今天的学习就到这里!如果您学习过程中如遇困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!

本教程完整目录可以关注下面的GitHub仓库获取,也可以通过文末的阅读原文直达教程页面。

代码示例

本文的完整工程可以查看下面仓库中2.x目录下的chapter8-1工程:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/

  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/

如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!

往期推荐

技术前沿:Redis推出性能碾压ES和Mongo的大杀器

墙裂推荐!卡神力作《代码随想录》,上架首日卖爆!

Maven推出强化项目:maven-mvnd,构建速度大幅提升!

厌倦了 VMware,试试更轻量级的虚拟机!

Java 18 都要来了,你不会还在用Java 8吧?

下面这个是我的小号,平时会分享一些我日常看到的有趣内容和个人思考,欢迎关注

点击阅读原文,直达教程目录

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章