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

如何记日志

在介绍写日志的方式有很多,这里就不对各种方式做罗列了,只讲DD用得最多的方式!

首先,在代码层面,我们不纠结到底用默认的Logback还是Log4j,而是直接用:Slf4j

为什么不用管具体用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种元素,具体如下:

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

日志输出

在Spring Boot应用中,日志会默认会输出到控制台中,默认的输出日志级别包含:ERRORWARNINFO,我们可以帮上面写的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并没有输出。

日志配置

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

多彩输出

如果你的终端支持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就可以被成功输出了。

自定义日志配置

由于日志服务一般都在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技术交流群,参与交流与讨论,更好的学习与进步!汇总页面《Spring Boot基础教程》可以点击直达!,欢迎收藏与转发支持!

代码示例

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

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

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

Spring Boot 2 中的默认日志管理与 Logback 配置详解的更多相关文章

  1. commons-logging和Log4j 日志管理/log4j.properties配置详解

    commons-logging和Log4j 日志管理 (zz) 什么要用日志(Log)? 这个……就不必说了吧. 为什么不用System.out.println()? 功能太弱:不易于控制.如果暂时不 ...

  2. (网页)Java日志记录框架Logback配置详解(企业级应用解决方案)(转)

    转自CSDN: 前言 Logback是现在比较流行的一个日志记录框架,它的配置比较简单学习成本相对较低,所以刚刚接触该框架的朋友不要畏惧,多花点耐心很快就能灵活应用了.本篇博文不会具体介绍Logbac ...

  3. Spring Boot 2.x 快速入门(下)HelloWorld示例详解

    上篇 Spring Boot 2.x 快速入门(上)HelloWorld示例 进行了Sprint Boot的快速入门,以实际的示例代码来练手,总比光看书要强很多嘛,最好的就是边看.边写.边记.边展示. ...

  4. 日志分析工具ELK配置详解

    日志分析工具ELK配置详解 一.ELK介绍 1.1 elasticsearch 1.1.1 elasticsearch介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分 ...

  5. Spring Boot 整合 slf4j+log4j2 实现日志管理

    背景 Java 中比较常用的日志框架: log4j(Log for Java):Apache 的一个开源项目,七种日志级别:OFF.FATAL.ERROR.WARN.INFO.DEBUG.TRACE ...

  6. 【docker-compose】使用docker-compose部署运行spring boot+mysql 【处理容器的时区问题】【详解】【福利:使用docker-compose构建 wordpress+mysql】

    ==================================================================================================== ...

  7. slf4j+logback日志框架 的具体使用操作【spring boot自带的默认日志框架】

    1.前言 是不是还在使用System.out.println()打印数据到控制台看? 东西少还好,如果多起来,那就看的很烦人了,特别还有加时间等信息. 怎么解决? 可以使用日志框架 ,常见的有 log ...

  8. 【Spring Boot学习之五】切面日志管理

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 一.log4j 常见方式:log4j.properties + org.apache.log4j.Logger比如:l ...

  9. Spring Boot 整合 slf4j+log4j 实现日志管理

    一:首先新建一个jar项目,如下图: 二:添加log4j的依赖,如下pom.xml文件: <project xmlns="http://maven.apache.org/POM/4.0 ...

随机推荐

  1. javascript的原型与原型链

    首先套用一句经典名言,JavaScript中万物皆对象. 但是对象又分为函数对象和普通对象. function f1(){}; var f2=function(){}; var f3=new Func ...

  2. fastJson序列化

    在pojo实体中有map<String,Object>的属性,有个key是user它存储在数据库中是用户的id数组,而在aop里会对这个属性做用户详细信息查询并重新put给user.在做J ...

  3. How exactly does Google AdWords work?

    The key to how Google AdWords works is the Quality Score. Quality Score is generally how well an ad ...

  4. mysql外键策略

    1.外键 建表时添加外键:constraint 外键名 foreign key 从表字段 references 主表字段 级联操作 create table dage( create table xi ...

  5. 分布式系统为什么不用自增id,要用雪花算法生成id???

    1.为什么数据库id自增和uuid不适合分布式id id自增:当数据量庞大时,在数据库分库分表后,数据库自增id不能满足唯一id来标识数据:因为每个表都按自己节奏自增,会造成id冲突,无法满足需求.  ...

  6. HTTP协议及常见状态码

    超文本传输协议(HTTP)是用于传输诸如HTML的超媒体文档的应用层协议.它被设计用于Web浏览器和Web服务器之间的通信,但它也可以用于其他目的. HTTP遵循经典的客户端-服务端模型,客户端打开一 ...

  7. 隐藏和显示div的两种方法

    方式一 style="visibility: none;" visiblity:visible -------->可见 visiblity:hidden -------> ...

  8. 逻辑判断(Power Query 之 M 语言)

    逻辑真:true 逻辑假:false 与函数:and true and true,结果为TRUE true and false,结果为FALSE false and false,结果为FALSE 或函 ...

  9. 面试官:HashSet如何保证元素不重复?

    本文已收录<Java常见面试题>系列,Git 开源地址:https://gitee.com/mydb/interview HashSet 实现了 Set 接口,由哈希表(实际是 HashM ...

  10. MySQL 定时器

    mysql定时器是系统给提供了event,而oracle里面的定时器是系统给提供的job.废话少说,下面创建表:create table mytable (id int auto_increment ...