实习生:大佬好,今天你要讲什么呀?
小编:今天跟你讲讲 Spring Boot 日志是怎么回事的,先看下我整理的思维导图吧。
今天就从这几个角度来讲。
实习生:好的,那我们先来看看概述吧。
小编:spring boot 内部使用的是 apache 开源的 commons logging 来记录日志的。但是呢,它又提供了基础的日志实现接口,方便向 java util logging、 log4j、logback之类的接入。spring boot 现在已经为 Java util logging 、log4j2、logback 提供了默认的实现。我们如果需要使用的话,只要简单配置就可以了。
实习生:要这么说的话,spring boot 可真nb啊,轻轻松松就搞定了。你刚刚说了 spring boot 已经内置实现了 logback 这些, 那我看你图里还有starter的描述啊,默认所有的都夹在进来了吗?
小编:小伙子可以啊,spring boot 当然没有把所有的都加载进来,条件自动化配置你忘记了吗?如果我们项目只依赖了一个 spring-boot-starter 的话,你看我这个项目的依赖图,自由这么几个,如果你想依赖 log4j2 的话,你要添加 spring-boot-starter-log4j2 才行。
实习生:soga, 我懂了。
小编:我们来看看日志的输出格式是怎么样的。我们平时启动项目的时候,在控制台上看到的这些内容,是有固定的格式的。
一开始是日期和时间,然后是日志的等级、线程ID、分割线、线程名称、logger name 、日志消息。我在思维导图里做了归纳, 日志等级这里我使用的是logback的等级制度,部分其他的会是以FATAL 代替 ERROR 的。
实习生:这个挺简单的呀。你这么一画,我感觉很清晰啊。你看这个终端输出那里有不同的颜色,这个是怎么配置的呢?
小编:不要着急啊, 你看我的思维导图,下一个环节不就是要讲了吗?
默认情况下,spring boot 项目的日志输出方式是控制台输出。控制台输出一般情况下只有3中输出方式,就是上面写的 ERROR、WARN、INFO。因为打开debug的话,所有其他的日志都会打出来,对我们开发来说不太方便。
实习生:那这个还是可以打开的吧,或者我想调试spring boot 的启动过程之类的,我就想把它打开,这样我对启动过程可以看的更加清楚一些。
小编:是的,你可以打开,而且也挺方便的。有两种方式,第一种方式就是通过命令行设置
<pre class="prettyprint hljs nginx" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">java -jar myapp.jar --debug</pre>第二种:在配置文件里直接配置就行
<pre class="prettyprint hljs lua" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">application.properties 配置 debug=true</pre>至于,刚才你说到的颜色问题,其实也蛮简单的,如果你的控制台支持 ASNI 的话,就配置一下就可以了,主要是配置%clr 这个轻轻松松搞定了。直接看思维导图就行了。
实习生:你说的没错,但是我还有一个疑问,ASNI是什么?
小编:这玩意就是一种编码方式,一句两句也讲不清楚,我给你搜索一下吧。
ANSI是一种字符代码,为使计算机支持更多语言,通常使用 0x00~0x7f 范围的1 个字节来表示 1 个英文字符。超出此范围的使用0x80~0xFFFF来编码,即扩展的ASCII编码。
小编:接下来我们看看文件输出日志的配置,默认情况下我们只要在applicaiton.properties文件直接配置就行了。
<pre class="prettyprint hljs delphi" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">logging.file.name=app.log logging.file.path=/xxx</pre>实习生:这个我知道,但是你导图上写的文件分割,又是怎么回事呢?
小编:这个你都没懂吗?我们日志写入到文件里之后,如果我们不处理的话,文件可以把你电脑写爆了。另一方面,方便我们处理日志文件啊。
实习生:好的,大佬我错了。我怎么没想到呢。
小编:别扯这些,我们继续来看。
实习生:你这个写的啥意思啊?没懂,上面不是讲过了,再讲一遍?
小编:上面只是提了下等级,并没有提怎么设置,你看仔细了,我们可以针对某个package来设置日志输出的等级。
实习生:唉,这个我怎么没想到呢,可以单独设置。我之前看项目我都没注意到这个问题。
小编:没关系,现在不是已经知道了吗?我们继续吧。
实习生:好的,大佬,你这里写的日志关闭hook是干啥的?
小编:其实这个就像我们spring boot 怎么做到优雅停机一样。我们要做到先把日志打印入口先关闭了,然后把打印的日志打印完,我再结束我这个日志打印的线程。
实习生:你这么说我就明白了。
小编:上面讲述的都是通过配置spring boot 默认实现的方式来配置日志,我们还可以自己个性化配置日志输出的情况。在这我们以前spring 项目的时候,是很常见的。我们现在也一直在延续使用这种方式。
实习生:那你这个最后那个环节 也是和这个自定义配置有关了吧
小编:你小子眼睛还挺尖的啊,我这里主要是说明两个东西,一个是 spring boot profiles在日志文件中的应用。
<pre class="prettyprint hljs xml" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><springProfile name="dev | staging"> ... </springProfile></pre>另外一个是怎么引入 sping的环境变量。
<pre class="prettyprint hljs dust" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><springProperty scope="context" name="fluentHost" source="myapp.fluentd.host" defaultValue="localhost"/> <appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender"> <remoteHost>${fluentHost}</remoteHost> ... </appender></pre>实习生:hoho,可以啊,这操作不错。
总结
小编今天就是带大家过一遍 spring boot logging 是什么一回事,怎么配置使用的。