使用ApiBoot Logging进行统一管理请求日志

ApiBoot Logging通过集成minbox-logging来进行管理每一次请求的日志信息,包含头信息参数主体内容路径、发生的服务器相关信息等,根据接口的响应状态还可以记录响应的头信息、响应的内容以及发生异常时的堆栈信息

免费教程专题

恒宇少年在博客整理三套免费学习教程专题,由于文章偏多特意添加了阅读指南,新文章以及之前的文章都会在专题内陆续填充,希望可以帮助大家解惑更多知识点。

minbox-projects开源组织

“org.minbox.framework” 致力于向广大开发者提供一系列的 “开箱即用” 的框架落地实现解决方案。

自从ApiBoot框架的落地,内部集成的第三方插件(plugin)日渐增多也同样导致了ApiBoot的源码太过于冗肿,针对这个问题minbox-projects开源组织就诞生了,ApiBoot第一个加入了该组织,并且会将ApiBoot内集成的第三方插件进行陆续分离,将每一个插件作为独立的开源项目加入minbox-projects开源组织,方便各个项目的单独维护以及更新发版。

组织首页:https://gitee.com/minbox-projects

minbox-logging日志组件

minbox-logging日志组件是minbox-projects开源组织内的一员,是一款分布式零侵入式、链路式请求日志分析框架

提供Admin端点进行采集日志分析日志日志告警通知服务性能分析等。通过Admin Ui可查看实时链路日志信息、在线业务服务列表,致力解决request -> response整个业务请求的日志分析以及记录。

minbox-logging日志组件源码:https://gitee.com/minbox-projects/minbox-logging

创建示例项目

通过idea开发工具创建一个SpringBoot项目。

  • pom.xml依赖
<!--配置参数-->
<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;
    }
}
  • application.yml
spring:
  application:
    name: apiboot-unified-manage-request-logs
server:
  port: 8080

由于ApiBoot Logging需要记录日志产生的服务器相关信息,所以spring.application.name以及server.port这两个参数必须配置,要不然启动项目时会抛出错误信息。

  • @EnableLoggingClient注解
@SpringBootApplication
@EnableLoggingClient
public class ApibootUnifiedManageRequestLogsApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApibootUnifiedManageRequestLogsApplication.class, args);
    }

}

使用@EnableLoggingClient注解来开启日志的客户端,将该注解配置在入口类上,内部通过ImportBeanDefinitionRegistrar进行注册minbox-logging-client所需要的Bean

ApiBoot的版本统一依赖

我们在使用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"
}

这样是不是很直接明了的看到了请求的详细信息了?不过建议根据自己项目的实际情况来配置,美化后的日志会占用更多的控制台行

LoggingNotice日志通知

ApiBoot Logging提供了日志通知的接口,我们只需要实现该接口就可以获取到每一次请求日志对象,还可以自定义每一个日志通知实现类的执行顺序

ApiBoot Logging内部提供的实现类如下图所示:

  • LoggingLocalNotice

    该类就是用于在控制台打印请求日志以及美化请求日志的实现,优先级为:Ordered#HIGHEST_PRECEDENCE(最高优先级)。

  • LoggingAdminNotice

    该类用于将请求日志上报到Logging Admin,优先级为:Ordered#HIGHEST_PRECEDENCE +1,仅低于LoggingLocalNotice

使用LoggingNotice添加Header

在上面我们已经知道了两个内置的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的集成使用,可用于采集请求日志,能力确不仅仅如此,使用得当它会很强大,日志通知设计可以使我们很好的控制一个请求的日志,对日志进行添加标识归类等,可以通过配置来控制日志打印以及美化

作者个人 博客
使用开源框架 ApiBoot 助你成为Api接口服务架构师

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容