序言
大家好,我是老马。
平时一直在使用 springboot,却总感觉对于其理解不深入,于是有两个这个系列的整理。
主要是为了系统的学习一下 springboot,残缺补漏一下。主要翻译自官方文档,结合自己的实际使用。
springboot 学习笔记(一)引导类特性详解
springboot 学习笔记(二)外部化配置详解
springboot 教程(三)如何实现配置与环境隔离?
![9f62212a66b578c09c2c8cb6e842bf24.png](https://i-blog.csdnimg.cn/blog_migrate/9013e71d39702cb934a572d21c5a26da.jpeg)
日志
场景
日志是为了问题排查定位,是非常必要的功能。
springboot 默认配置的 logging 就可以非常方便我们使用,不过还有一些细节,值得我们学习一下。
logging
springboot 默认使用 common logging 进行内部的日志输出。
当然,业界最有希望一统天下的就是 slf4j 这套接口标准。
当我们使用 starter 时,默认使用 logback 作为日志实现。
日志格式
我们截取一段日志格式如下:
2021-01-11 19:41:08.821 INFO 1300 --- [ main] c.g.h.s.boot.learn.profile.Application : Starting Application on hackerone with PID 1300 (D:githubspring-boot-learnspring-boot-profileargetclasses started by Administrator in D:githubspring-boot-learn)2021-01-11 19:41:08.824 INFO 1300 --- [ main] c.g.h.s.boot.learn.profile.Application : The following profiles are active: prod2021-01-11 19:41:08.883 INFO 1300 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@195092a: startup date [Mon Jan 11 19:41:08 CST 2021]; root of context hierarchy2021-01-11 19:41:10.221 INFO 1300 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 18080 (http)2021-01-11 19:41:10.232 INFO 1300 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]2021-01-11 19:41:10.233 INFO 1300 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.23
输出以下项目:
- 日期和时间:毫秒精度,易于排序。
- 日志级别:错误,警告,信息,调试或跟踪。
- 进程ID。
- --- 分隔符用于区分实际日志消息的开始。
- 线程名称:用方括号括起来(对于控制台输出可能会被截断)。
- 记录器名称:这通常是源类名称(通常缩写)。
- 日志消息。
一般情况下,这些配置就已经足够了,不过还是建议添加一个 traceId,这样更加便于问题排查。
你可以阅读:
java 注解自动输出日志新增拦截器与过滤器
java 注解结合 spring aop 日志唯一标识
java 注解结合 spring aop 实现自动输出日志
控台日志
调整日志级别
一般情况下是 INFO 级别,如果我们想调整日志级别怎么办呢?
有两种方式:
(1)命令行指定
$ java -jar myapp.jar --debug
(2)配置文件指定
在 application.properties 文件中添加
debug=true
效果如下:
2021-01-11 20:32:03.694 INFO 8764 --- [ main] c.g.h.s.boot.learn.profile.Application : The following profiles are active: prod2021-01-11 20:32:03.694 DEBUG 8764 --- [ main] o.s.boot.SpringApplication : Loading source class com.github.houbb.spring.boot.learn.profile.Application2021-01-11 20:32:03.754 DEBUG 8764 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Activated profiles prod
彩色输出
彩色输出可以让我们更加方便的在控台看出日志的级别。
ERROR 一般是红色,WARN 一般是黄色。
我们的视觉永远更加敏锐一些,不过这也只局限于控台日志,当真输出到文件时,还是白纸黑字。
文件输出
生产中,日志需要长期保留,所以需要输出到对应的文件中。
不过一般实践中,都会直接使用 logback.xml 之类的配置,所以这里只做简单的介绍。
文件名称
默认是只输出到控台的。我们可以指定输出的路径,名称可以是确切的位置,也可以相对于当前目录。
- 指定文件
# 写入指定的日志文件。logging.file.name = my.log
- 指定文件夹
# 将spring.log写入指定目录。logging.file.path = /var/log
日志的归档
生成的日志量一般比较大,磁盘都是有限的,所以一般都会对 3 天以上的日志进行归档。
单个的日志文件也不能太大,一般 500M 一个文件。
日志级别
我们有时针对不同的类,希望看到的日志级别可能不同。
比如希望看到 mapper 对应的详细 sql,一般开启 DEBUG 级别。
对于一些中间件 mq 之类的,可能只关心 WARN 以上级别。
这些都可以通过配置方便的指定:
logging.level.root=warnlogging.level.org.springframework.web=debuglogging.level.org.hibernate=error
日志组
发现这个功能还是比较强大的,个人感觉就是把一系列的包归为一个组,可以更加方便的配置日志级别等。
实现方式:
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
这样就可以把 org.apache.catalina 和 org.apache.coyote,org.apache.tomcat 都认为是 logging.group.tomcat 这个组。
我们可以使用下面的方式,统一修改日志级别:
logging.level.tomcat=trace
内置
当然,springboot 有一些开箱即用的内置策略:
- web
包含:
org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans
- sql
包含:
org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener
logback 拓展
针对 logback,spring 还做了一些拓展功能,让其变得更加强大。
特定 profile 的配置
通过 标记,您可以根据活动的Spring概要文件有选择地包括或排除配置部分,在 元素内的任何位置都支持这个属性。 这样才做了 profile 与配置的更加强大的整合。 ¨G11G ¨K28K ` 标记使您可以从Spring Environment中公开属性,以在Logback中使用。
${fluentHost} ...
小结
希望本文对你有帮助,如果有其他想法的话,也可以评论区和大家分享哦。
各位极客的点赞收藏转发,是老马持续写作的最大动力!
我是老马,期待与你的下次重逢。
![971423fdf6333f777b5893e8a3a19935.png](https://i-blog.csdnimg.cn/blog_migrate/0d8dbbc9e65915a3a785998ea9939375.jpeg)