ApiBoot Logging
经过集成minbox-logging
来进行管理每一次请求的日志信息,包含头信息
、参数
、主体内容
、路径
、发生的服务器
相关信息等,根据接口的响应状态还能够记录响应的头信息、响应的内容以及发生异常时的堆栈信息
。java
“org.minbox.framework”
致力于向广大开发者提供一系列的 “开箱即用”
的框架落地实现解决方案。git
自从ApiBoot
框架的落地,内部集成的第三方插件(plugin)
日渐增多也一样致使了ApiBoot
的源码太过于冗肿,针对这个问题minbox-projects
开源组织就诞生了,ApiBoot
第一个加入了该组织,而且会将ApiBoot
内集成的第三方插件
进行陆续分离,将每个插件做为独立的开源项目加入minbox-projects
开源组织,方便各个项目的单独维护以及更新发版。web
组织首页:gitee.com/minbox-proj…spring
minbox-logging
日志组件是minbox-projects
开源组织内的一员,是一款分布式零侵入式、链路式请求日志分析框架。json
提供Admin端点进行采集日志
、分析日志
、日志告警通知
、服务性能分析
等。经过Admin Ui可查看实时链路日志
信息、在线业务服务列表
,致力解决request -> response
整个业务请求的日志分析以及记录。api
minbox-logging日志组件源码:gitee.com/minbox-proj…bash
经过idea
开发工具建立一个SpringBoot
项目。服务器
<!--配置参数-->
<properties>
<java.version>1.8</java.version>
<api.boot.version>2.1.4.RELEASE</api.boot.version>
</properties>
<dependencies>
<!--Web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--ApiBoot Logging-->
<dependency>
<groupId>org.minbox.framework</groupId>
<artifactId>api-boot-starter-logging</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<!--ApiBoot统一版本依赖-->
<dependencies>
<dependency>
<groupId>org.minbox.framework</groupId>
<artifactId>api-boot-dependencies</artifactId>
<type>pom</type>
<scope>import</scope>
<version>${api.boot.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
复制代码
添加一个用于测试的LoggingSampleController
控制器,源码以下所示:架构
/** * 请求日志示例 * * @author 恒宇少年 */
@RestController
@RequestMapping(value = "/test")
public class LoggingSampleController {
/** * 验证请求参数以及相应内容 * * @param name * @return */
@GetMapping
public String hello(@RequestParam("name") String name) {
return "你好:" + name;
}
/** * 验证主体请求内容以及相应内容 * * @param user * @return */
@PostMapping
public String bodyHello(@RequestBody User user) {
return "你好:" + user.getName();
}
/** * RequestBody 示例类 */
@Data
public static class User {
private String name;
}
}
复制代码
spring:
application:
name: apiboot-unified-manage-request-logs
server:
port: 8080
复制代码
因为ApiBoot Logging
须要记录日志产生的服务器相关信息,因此spring.application.name
以及server.port
这两个参数必须配置,要否则启动项目时会抛出错误信息。app
@SpringBootApplication
@EnableLoggingClient
public class ApibootUnifiedManageRequestLogsApplication {
public static void main(String[] args) {
SpringApplication.run(ApibootUnifiedManageRequestLogsApplication.class, args);
}
}
复制代码
使用@EnableLoggingClient
注解来开启日志的客户端,将该注解配置在入口类上,内部经过ImportBeanDefinitionRegistrar
进行注册minbox-logging-client
所须要的Bean
。
咱们在使用SpringBoot
时发现咱们添加的依赖并不须要指定具体的版本号
,这就是版本统一依赖起到的做用,主要仍是Maven继承关系
缘故。
在ApiBoot
内也存在这么一个统一维护依赖版本的模块api-boot-dependencies
,这个模块源码仅一个pom.xml
文件,主要用来配置每个第三方依赖或者内置的依赖的具体版本。
咱们经过在项目中的pom.xml
配置文件内添加以下版本管理依赖:
<dependencyManagement>
<!--ApiBoot统一版本依赖-->
<dependencies>
<dependency>
<groupId>org.minbox.framework</groupId>
<artifactId>api-boot-dependencies</artifactId>
<type>pom</type>
<scope>import</scope>
<version>${api.boot.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
复制代码
就能够不指定版本号使用ApiBoot
所提供的所有依赖。
项目准备完成,咱们先来把项目经过SpringBoot Application
方式进行启动,经过以下curl
命令访问咱们的测试接口:
curl http://localhost:8080/test\?name\=hengboy
复制代码
访问完成后,请求成功,可是控制台并无打印任何请求日志信息,却是有一个警告的日志:
Not set 【LoggingAdminDiscovery】in LoggingFactoryBean,don't invoke report request logs. 复制代码
这个警告告知的很清楚,咱们并未配置logging-admin
,因此没法执行日志的上报,咱们本章节是独立使用ApiBoot Logging
日志组件,因此这个警告信息能够忽略。
ApiBoot Logging
提供了一个配置api.boot.logging.show-console-log
,该配置默认值为false
,经过该配置能够实如今控制台打印请求日志。
在application.yml
配置文件内添加配置以下所示:
api:
boot:
# ApiBoot Logging 日志组件配置
logging:
show-console-log: true
复制代码
添加完成后,重启项目,再次访问测试接口,控制台打印以下所示:
2019-10-16 10:20:18.489 INFO 3930 --- [ task-1] o.m.f.l.c.n.support.LoggingLocalNotice : Request Uri:/test, Logging:
{"endTime":1571192418416,"httpStatus":200,"requestBody":"","requestHeaders":{"host":"localhost:8080","user-agent":"curl/7.64.1","accept":"*/*"},"requestIp":"0:0:0:0:0:0:0:1","requestMethod":"GET","requestParam":"{\"name\":\"hengboy\"}","requestUri":"/test","responseBody":"你好:hengboy","responseHeaders":{},"serviceId":"apiboot-unified-manage-request-logs","serviceIp":"127.0.0.1","servicePort":"8080","spanId":"35a22772-5015-438a-a441-ba407926b789","startTime":1571192418391,"timeConsuming":25,"traceId":"ec53d162-314e-4516-8c24-5d5e03181543"}
复制代码
这时咱们就能够看到打印的请求日志信息了,不过打印的日志内容并未进行美化,不要着急,ApiBoot Logging
一样提供了一个配置来进行美化输出内容。
ApiBoot Logging
提供了配置api.boot.logging.format-console-log-json
,该参数默认为false
,咱们经过修改该配置的值能够实现美化打印请求日志。
在application.yml
配置文件内添加配置以下所示:
api:
boot:
# ApiBoot Logging 日志组件配置
logging:
show-console-log: true
format-console-log-json: true
复制代码
添加完成后咱们再次来重启项目后,访问测试接口,控制台打印以下所示:
2019-10-16 10:24:05.480 INFO 4051 --- [ task-1] o.m.f.l.c.n.support.LoggingLocalNotice : Request Uri:/test, Logging:
{
"endTime":1571192645404,
"httpStatus":200,
"requestBody":"",
"requestHeaders":{
"accept":"*/*",
"host":"localhost:8080",
"user-agent":"curl/7.64.1"
},
"requestIp":"0:0:0:0:0:0:0:1",
"requestMethod":"GET",
"requestParam":"{\"name\":\"hengboy\"}",
"requestUri":"/test",
"responseBody":"你好:hengboy",
"responseHeaders":{},
"serviceId":"apiboot-unified-manage-request-logs",
"serviceIp":"127.0.0.1",
"servicePort":"8080",
"spanId":"277c0973-8042-4740-a8e7-2dbb0c7bb42c",
"startTime":1571192645381,
"timeConsuming":23,
"traceId":"7a742942-f3cc-4d72-9493-d828b090f1cc"
}
复制代码
这样是否是很直接明了的看到了请求的详细信息了?不过建议根据本身项目的实际状况来配置,美化后的日志会占用更多的控制台行。
ApiBoot Logging
提供了日志通知的接口,咱们只须要实现该接口就能够获取到每一次请求
的日志对象
,还能够自定义每个日志通知实现类的执行顺序
。
在ApiBoot Logging
内部提供的实现类以下图所示:
LoggingLocalNotice
该类就是用于在控制台打印请求日志以及美化请求日志的实现,优先级为:Ordered#HIGHEST_PRECEDENCE
(最高优先级)。
LoggingAdminNotice
该类用于将请求日志上报到Logging Admin
,优先级为:Ordered#HIGHEST_PRECEDENCE +1
,仅低于LoggingLocalNotice
。
在上面咱们已经知道了两个内置的LoggingNotice
实现类,优先级咱们也已经清楚了,那么咱们若是添加自定义的LoggingNotice
实现类来向本次请求日志的RequestHeader
内添加一个咱们自定义的头信息该怎么作呢?
AddHeaderLoggingNotice通知类源码以下所示:
/** * 经过{@link LoggingNotice}向日志的请求header内添加区域信息 * * @author 恒宇少年 */
@Component
public class AddHeaderLoggingNotice implements LoggingNotice {
/** * 区域头信息key */
private static final String SERVER_REGION = "server-region";
@Override
public void notice(MinBoxLog minBoxLog) {
minBoxLog.getRequestHeaders().put(SERVER_REGION, "JiNan");
}
/** * 最大优先级 * * @return */
@Override
public int getOrder() {
return HIGHEST_PRECEDENCE;
}
}
复制代码
因为minbox-logging
在设计初期就已经考虑到了这一点,因此添加起来比较简单,咱们只须要调整咱们自定义日志通知的优先级,而后经过#notice
方法修改本次请求日志对象的值便可。
本章节咱们介绍了ApiBoot Logging
的集成使用,可用于采集请求日志,能力确不单单如此,使用得当它会很强大,日志通知设计
可使咱们很好的控制一个请求的日志,对日志进行添加标识
、归类
等,能够经过配置来控制日志打印
以及美化
。