Spring Boot 在 spring-boot-starter-actuator 模块中提供了日志相关的 EndPoint,通过该 EndPoint 可以在运行时不需要重启服务就可以修改日志的打印级别。
解决了以前修改日志打印级别必须要重启服务的烦恼。
环境信息
- spring boot 2.0.4.RELEASE(1.5以前的版本不适用该博文)
- JDK 1.8
POM 信息
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
启用loggers Endpoint
出于安全因素考虑,依赖spring-boot-starter-actuator后,默认值启用了“/health”和“/info”两个 Endpoint
可以通过如下配置启用所有的 endpoint
management.endpoints.web.exposure.include=*
- 1
也可以通过该配置启用指定的 endpoint
management.endpoints.web.exposure.include=loggers,sessions
- 1
查看日志级别
我们可以通过浏览器请求到 http://127.0.0.1:8080/actuator/loggers 来获取支持的日志等级,以及系统默认的日志等和各个包路径对应的日志级别。
ps: 如下结果是精简过的,实际返回值很多
{
"levels":[
"OFF",
"ERROR",
"WARN",
"INFO",
"DEBUG",
"TRACE"
],
"loggers":{
"ROOT":{
"configuredLevel":"INFO",
"effectiveLevel":"INFO"
},
"com":{
"configuredLevel":null,
"effectiveLevel":"INFO"
},
"com.github":{
"configuredLevel":null,
"effectiveLevel":"INFO"
},
"com.github.huotaihe":{
"configuredLevel":null,
"effectiveLevel":"INFO"
},
"com.github.huotaihe.spring":{
"configuredLevel":null,
"effectiveLevel":"INFO"
},
"com.github.huotaihe.spring.boot":{
"configuredLevel":null,
"effectiveLevel":"INFO"
},
"com.github.huotaihe.spring.boot.log":{
"configuredLevel":null,
"effectiveLevel":"INFO"
},
"com.github.huotaihe.spring.boot.log.Application":{
"configuredLevel":null,
"effectiveLevel":"INFO"
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
配置日志级别
编写日志输出类
编写一个controller 输出各个级别的日志:
注意:日志门面类要使用 commons-log,而不能使用 sl4j;
使用 sl4j 会导致日志级别不生效,具体原因会继续跟进。
package com.github.huotaihe.spring.boot.log;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LogController {
private final static Logger LOG = LoggerFactory.getLogger(LogController.class);
@GetMapping("/log")
public Map<String, Object> home() {
if(LOG.isTraceEnabled()){
LOG.trace(“trace level log”);
}
<span class="token keyword">if</span><span class="token punctuation">(</span>LOG<span class="token punctuation">.</span><span class="token function">isDebugEnabled</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
LOG<span class="token punctuation">.</span><span class="token function">debug</span><span class="token punctuation">(</span><span class="token string">"debug level log"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>LOG<span class="token punctuation">.</span><span class="token function">isInfoEnabled</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
LOG<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">"info level log"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>LOG<span class="token punctuation">.</span><span class="token function">isWarnEnabled</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
LOG<span class="token punctuation">.</span><span class="token function">warn</span><span class="token punctuation">(</span><span class="token string">"warn level log"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>LOG<span class="token punctuation">.</span><span class="token function">isErrorEnabled</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
LOG<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">"error level log"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
Map<span class="token generics function"><span class="token punctuation"><</span>String<span class="token punctuation">,</span> Object<span class="token punctuation">></span></span> result <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token operator"><</span><span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
result<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"status"</span><span class="token punctuation">,</span> <span class="token string">"good"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
result<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">,</span> <span class="token string">"abc"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
result<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"password"</span><span class="token punctuation">,</span> <span class="token string">"abc"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> result<span class="token punctuation">;</span>
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
测试日志级别
启动应用并访问http://127.0.0.1:8080/log
控制台打印如图,Spring Boot 默认的 ROOT 日志级别是INFO。
修改指定包的日志级别
通过/actuator/loggers端点提供的 POST 请求,修改包路径com.github.huotaihe.spring.boot.log 的日志级别为DEBUG。
header 信息必须添加
Content-Type:application/json
- 浏览器通过 GET 方式访问如下地址
http://127.0.0.1:8080/actuator/loggers/com.github.huotaihe.spring.boot.log
查看当前包的目前日志级别
{
"configuredLevel": "DEBUG",
"effectiveLevel": "DEBUG"
}
- 1
- 2
- 3
- 4
- 再次访问http://127.0.0.1:8080/log 得到
源代码
github: https://github.com/huotaihe/spring-boot-learn/tree/master/runtime-log-level
参考:http://blog.huotaihe.com/2018/12/17/springboot-runtime-log-level/
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet">
</div>