首页 > 其他分享 >Spring Boot 的默认日志管理与 Logback 配置详解

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

时间:2022-11-26 23:07:01浏览次数:36  
标签:输出 logging Spring Boot 默认 日志 Logback


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

积累超车资本,从关注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
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项目,我们都可以在控制台看到很多日志信息,比如下面这样的一条日志:


Spring Boot 的默认日志管理与 Logback 配置详解_java

日志的输出内容中一共有7种元素,具体如下:

  1. 时间日期:精确到毫秒
  2. 日志级别:ERROR, WARN, INFO, DEBUG or TRACE
  3. 进程ID
  4. 分隔符:​​---​​ 标识实际日志的开始
  5. 线程名:方括号括起来(可能会截断控制台输出)
  6. Logger名:通常使用源代码的类名
  7. 日志内容

日志输出

在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​​级别:

第一种:在运行命令后加入​​--debug​​​标志,如:​​$ java -jar myapp.jar --debug​

第二种:在配置文件​​application.properties​​​中配置​​debug=true​

这里开启的DEBUG日志,仅影响核心Logger,包含嵌入式容器、hibernate、spring等这些框架层面的会输出更多内容,但是你自己应用的日志并不会输出为DEBUG级别,从下面的截图中我们就可以看到,我们自己编写的debug级别的Hello World并没有输出。


Spring Boot 的默认日志管理与 Logback 配置详解_java_02

日志配置

下面介绍一些常用的日志配置,以帮助我们更好的管理好日志内容。

多彩输出

如果你的终端支持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​​:归档前日志文件的最大尺寸,默认为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=DEBUG​​​:​​com.didispace​​包下所有class以DEBUG级别输出
  • ​logging.level.root=WARN​​:root日志以WARN级别输出

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


Spring Boot 的默认日志管理与 Logback 配置详解_java_03

logging.level.com.didispace=DEBUG

自定义日志配置

由于日志服务一般都在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官方推荐优先使用带有-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支持,您的关注是我坚持的动力!


标签:输出,logging,Spring,Boot,默认,日志,Logback
From: https://blog.51cto.com/u_14299052/5889226

相关文章

  • 【Spring】——8、如何使用FactoryBean向Spring容器中注册bean?
    ......
  • 【Spring】——9、如何指定初始化和销毁的方法?
    ......
  • springboot中配置文件的读取顺序
    1.简介在一个springboot项目中是可以存在多个配置文件的,那这些配置文件的所在位置以及具体内容的不同会影响他们被springboot加载的优先级吗?答案是肯定的,下面,我做一个四种不......
  • Springboot中application.yml、application.properties和bootStrap.yml的加载顺序
    一、SpringApplication位于项目根目录,所以所有得代码要和SpringApplication所在目录平级或下一级二、以jar包发布springboot项目时,默认会先使用jar包跟目录下的application.......
  • SpringCould入门
    微服务的优点与缺点?优点:每个服务足够内聚,足够小,代码容易理解这样能聚焦一个指定的业务功能或业务需求开发简单、开发效率提高,一个服务可能就是专一的只干一件事微服务能够......
  • SpringBoot2笔记
    SpringBoot2:注意事项:​1、SpringBoot的启动类需要和逻辑代码所在的包在同一个包下。(主程序所在的包及其以下子包中的组件都会进行扫描)​......
  • SpringBoot(监控)
    1-2-3-然后使用json.cnjson的可视化工具,进行查看。4-待更新...............
  • spring三级缓存
    IOC容器中的bean是单例的bean生命周期 什么是循环依赖    什么是成品对象和半成品对象   解决循环依赖方式  spring中使用三个map来表示三级缓......
  • SpringMVC文件上传
    1 文件上传客户端三要素* 表单项type="file"* 表单的提交方式时post* 表单的enctype属性时多部分表单形式,即enctype="multipart/form-data"2......
  • springboot事务源码分析
    1、本次使用springboot框架分析事务源码2、打开spring-boot-autoconfigure查看spring.factories发现关于事务的自动配置包含:DataSourceTransactionManagerAutoConfigurati......