Spring Boot 2 中的默认日志管理与 Logback 配置详解
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
@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级别:
第一种:在运行命令后加入--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官方推荐优先使用带有-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工程:
- Github:https://github.com/dyc87112/SpringBoot-Learning/
- Gitee:https://gitee.com/didispace/SpringBoot-Learning/
如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!
欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源
Spring Boot 2 中的默认日志管理与 Logback 配置详解的更多相关文章
- commons-logging和Log4j 日志管理/log4j.properties配置详解
commons-logging和Log4j 日志管理 (zz) 什么要用日志(Log)? 这个……就不必说了吧. 为什么不用System.out.println()? 功能太弱:不易于控制.如果暂时不 ...
- (网页)Java日志记录框架Logback配置详解(企业级应用解决方案)(转)
转自CSDN: 前言 Logback是现在比较流行的一个日志记录框架,它的配置比较简单学习成本相对较低,所以刚刚接触该框架的朋友不要畏惧,多花点耐心很快就能灵活应用了.本篇博文不会具体介绍Logbac ...
- Spring Boot 2.x 快速入门(下)HelloWorld示例详解
上篇 Spring Boot 2.x 快速入门(上)HelloWorld示例 进行了Sprint Boot的快速入门,以实际的示例代码来练手,总比光看书要强很多嘛,最好的就是边看.边写.边记.边展示. ...
- 日志分析工具ELK配置详解
日志分析工具ELK配置详解 一.ELK介绍 1.1 elasticsearch 1.1.1 elasticsearch介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分 ...
- Spring Boot 整合 slf4j+log4j2 实现日志管理
背景 Java 中比较常用的日志框架: log4j(Log for Java):Apache 的一个开源项目,七种日志级别:OFF.FATAL.ERROR.WARN.INFO.DEBUG.TRACE ...
- 【docker-compose】使用docker-compose部署运行spring boot+mysql 【处理容器的时区问题】【详解】【福利:使用docker-compose构建 wordpress+mysql】
==================================================================================================== ...
- slf4j+logback日志框架 的具体使用操作【spring boot自带的默认日志框架】
1.前言 是不是还在使用System.out.println()打印数据到控制台看? 东西少还好,如果多起来,那就看的很烦人了,特别还有加时间等信息. 怎么解决? 可以使用日志框架 ,常见的有 log ...
- 【Spring Boot学习之五】切面日志管理
环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 一.log4j 常见方式:log4j.properties + org.apache.log4j.Logger比如:l ...
- Spring Boot 整合 slf4j+log4j 实现日志管理
一:首先新建一个jar项目,如下图: 二:添加log4j的依赖,如下pom.xml文件: <project xmlns="http://maven.apache.org/POM/4.0 ...
随机推荐
- 日常Java 2021/9/29
StringBuffer方法 public StringBuffer append(String s) 将指定的字符串追加到此字符序列. public StringBuffer reverse() 将 ...
- 关于java中的安全管理器
最近再查看java的源码的时候看见了这一类代码 final SecurityManager sm = System.getSecurityManager(); 想要了解这个是为了做什么,查看资料之后发 ...
- 大数据学习day28-----hive03------1. null值处理,子串,拼接,类型转换 2.行转列,列转行 3. 窗口函数(over,lead,lag等函数) 4.rank(行号函数)5. json解析函数 6.jdbc连接hive,企业级调优
1. null值处理,子串,拼接,类型转换 (1) 空字段赋值(null值处理) 当表中的某个字段为null时,比如奖金,当你要统计一个人的总工资时,字段为null的值就无法处理,这个时候就可以使用N ...
- deque、queue和stack深度探索(上)
deque是可双端扩展的双端队列,蓝色部分就是它的迭代器类,拥有四个指针,第一个cur用来指向当前元素,first指向当前buffer头部,last指向当前buffer尾部,node指向map自己当前 ...
- Activity 详解
1.活动的生命周期 1.1.返回栈 Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈.栈是一种先进后出的数据结构,在默认情况下,每当我们启 ...
- vue页面常用方法
输入框事件监听(三):blur与change的差异 iview 验证 trigger: 'blur,change', 同时加两个,省的每次还想input 还是 select 4.加载:Loading ...
- SpringBoot(2):运行原理
一. pom.xml 进入父项目,这里才是真正管理SpringBoot应用里面所有依赖版本的地方,SpringBoot的版本控制中心:以后我们导入依赖默认是不需要写版本:但是如果导入的包没有在依赖中管 ...
- 使用jquery刷新页面以及javascript的一些基本函数
如何使用jquery刷新当前页面 下面介绍全页面刷新方法:有时候可能会用到 1.window.location.reload()刷新当前页面. 2.parent.location.reload()刷新 ...
- 【C/C++】C++ warning: control reaches end of non-void function return
控制到达非void函数的结尾. 一些本应带有返回值的函内数到容达结尾后可能并没有返回任何值. 这时候,最好检查一下是否每个控制流都会有返回值. 我是ostream声明的时候没有写return out; ...
- Redis增加测试数据
目录 一.简介 二.操作 三.制造测试数据 一.简介 用shell脚本将文本内容挨个写到redis中效率是很慢的.打开一个链接,写入后再关闭,再打开,效率很低. redis支持pipe mode功能, ...