(18)go-micro微服务ELK介绍

目录
  • 一 什么是ELK
  • 二 Beats的六种工具
  • 三 ELK系统的特点
  • 四 ELK+beats系统架构
  • 五 ELK优点
  • 六 最后

一 什么是ELK

ELK是三个[开源软件]的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件,新增了一个Beats

  • Elasticsearch :是分布式搜索引擎,提供搜集、分析、存储数据三大功能

    • 主要特点 实时分析 分布式实时文件存储,并将每一个字段都编入索引 文档导向,所有的对象全部是文档 高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards 和 Replicas)。
  • Logstash :主要是用来日志的搜集、分析、过滤日志的工具

    • 几乎可以访问任何数据
    • 可以和多种外部应用结合
    • 支持弹性扩展
  • Kibana :提供友好的Web界面,可以帮助汇总分析和搜索数据

    • Kibana是一款基于 Apache开源协议,使用 JavaScript语言编写,为 Elasticsearch提供分析和可视化的 Web 平台。它可以在Elasticsearch的索引中查找,交互数据,并生成各种维度的表图.
  • Beats :是一-个轻量级的日志收集处理工具(Agent)

    • ELK 协议栈的新成员,一个轻量级开源日志文件数据搜集器。在需要采集日志数据的 server 上安装Filebeat,并指定日志目录或日志文件后,Filebeat就能读取数据,发送到Logstash进行解析,或直接发送到 Elasticsearch进行集中式存储和分析。

二 Beats的六种工具

  • Packetbeat :网络数据(收集网络流量数据)

  • Metricbeat :指标( 收集系统、进程和文件系统级别数据)

  • Filebeat: 日志文件(收集文件数据)

  • Winlogbeat : windows事件日志(收集Windows事件日志数据)

  • Auditbeat :审计数据(收集审计日志)

  • Heartbeat :运行时间监控(收集系统运行时的数据)

三 ELK系统的特点

  • 强大的收集能力:能够采集多种来源的日志数据

  • 稳定的传输能力 :能够把日志数据传输到中央系统

  • 分布式存储:可根据业务需求存储日志数据,可动态扩容

  • 分析&展示&提醒:具备数据分析能力,数据展示能力和告警能力

四 ELK+beats系统架构

Logstash 通过Filebeat从多种数据源(比如日志文件、标准输入 Stdin 等)获取数据,再经过滤插件加工数据,然后经 Elasticsearch 输出插件输出到 Elasticsearch,通过 Kibana 展示。

clipboard.png

五 ELK优点

  • 处理方式灵活: elasticsearch是实时全文索引,具有强大的搜索功能

  • 配置相对简单:elasticsearch全部使用JSON 接口,logstash使用模块配置,kibana的配置文件部分更简单。

  • 检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应。

  • 集群线性扩展:elasticsearch和logstash都可以灵活线性扩展

  • 前端操作良好:kibana的前端设计比较绚丽,而且操作简单。Kibana 界面上,只需要点击鼠标,就可以完成搜索、聚合功能,生成炫丽的仪表板。

六 最后

  • 至此,go-micro微服务ELK介绍工作就正式完成。

  • 接下来就开始filebeat收集日志的代码编写了,希望大家关注博主和关注专栏,第一时间获取最新内容,每篇博客都干货满满。

欢迎大家加入 夏沫の梦的学习交流群 进行学习交流经验,点击 夏沫の梦学习交流

本文转载于网络 如有侵权请联系删除

相关文章

  • Hash哈希竞猜游戏定制 哈希hash竞猜游戏系统开发 哈希竞猜游戏现成源码搭建

    Hash哈希竞猜游戏系统开发说明案例及源码  Hash,一般翻译做散列,或音译为哈希,普遍将其称之为散列函数,是把任意长度的输入(又叫做预映射pre-image)哈希算法的处理,转变为固定长度的输出,则输出的数据就可称之为散列值,或称之为哈希值。这种转换是一种压缩映射,也就是一种合理压缩的过程,输出的哈希值所占用的空间远小于输入的空间,但不同的输入可能会散列成相同的输出,换言之,输出值是唯一的,但无法找寻与其一一对应的输入值。  应用方向  由于散列函数应用的多样性,它们经常是专为某一应用而设计的。  错误校验  使用一个散列函数可以很直观地检测出数据在传输时发生的错误。在数据的发送方,将散列函数应用于未发送的数据中,并将计算结果和原始数据一同发送。那么,在数据的接收方,将接收到的数据利用相同的散列函数进行处理,如果两次散列函数计算出来的结果不同,那么就说明数据在传输的过程中出现了差错。这就叫做冗余校验。  信息安全  Hash算法是现代密码体系中保密程度最高的一种方式。由于非对称算法既费时又费力的弊端,所以在数字签名协议中,单向散列函数完全的取代了传统的加密方式。  NET6中哈希算

  • 《手把手教你》系列技巧篇(二十五)-java+ selenium自动化测试-FluentWait(详细教程)

    1.简介其实今天介绍也讲解的也是一种等待的方法,有些童鞋或者小伙伴们会问宏哥,这也是一种等待方法,为什么不在上一篇文章中竹筒倒豆子一股脑的全部说完,反而又在这里单独写了一篇。那是因为这个比较重要,所以宏哥专门为她量身定制了一篇。FluentWait是Selenium中功能强大的一种等待方式,翻译成中文是流畅等待的意思。在介绍FluentWait之前,我们来讨论下为什么需要设置等待,我们前面介绍了隐式等待和显式等待。在现在很多软件产品为了加强前端的效果,采取了大量的AJAX和Jquery技术,很多窗体内的数据,需要等待一会,才能加载完数据,才能出现一些元素,driver才能操作这些元素做一些事情。还有就是我们做一些操作,本身可能也需要等待一会才有数据显示。所以在自动化脚本开发过程,合理的设置时间等待是非常必要的,可以说百分之90以上的自动化测试用例执行失败,基本上是很时间等待有关系,造成元素没有及时在界面上显示,而报nosuchelement子类的错误。2.FluentWait的定义简单来说,FluentWait就是一个普通的类,我们使用这个类能支持一直等待直到特定的条件出现。1)是一个

  • 有赞白鸦内部培训全公开:企业服务类产品的底层逻辑和有赞产品设计原则

     作者:白鸦有赞产品设计原则写在前面作为一个产品团队,我们最需要的永远都是懂用户懂需求,并保持不断的创新力。有赞希望每个产品人在这里都能足够发挥自己的能量,为客户创造价值,并获取价值。于是,我们需要一个大家共同理解、遵循、迭代的《产品设计原则》,从而保障我们可以在不偏离的情况下肆意挥洒、充分创新。原则概要 有赞的《产品设计原则》,根据客户需求、有赞的使命和愿景、当前生态环境,以及我们所处的发展阶段拟定,它是每个有赞产品在设计过程中都要遵守的基本原则。我们还会定期对其进行优化和迭代。它是一个产品视角的原则,并非完整的市场、运营或者技术视角。在产品视角上,我们把产品设计过程分成了4个部分:产品定义、产品设计、产品研发、产品运营。产品定义:首先是定义客户和场景,面对什么样的客户,服务什么样的场景,它的使用场景是什么;然后是价值,客户价值和商业价值;再是全局,要做全局的整体的思考。产品设计:基于场景拆分用户的使用任务,任务再会拆分为功能和交互、内容和信息架构,最终把它呈现到界面上。产品研发:主要指界面设计、技术研发,还应该有用户体验及可用性测试的部分。产品运营:产品上线前后的基于产品的运营计划

  • Kali Linux Web渗透测试手册(第二版) - 3.9 - WebScarab的使用

    翻译来自:掣雷小组 成员信息:thr0cyte,Gr33k,花花,MrTools,R1ght0us,7089bAt,这个公众号,一定要关注哦,慢慢会跟上面老哥们一起分享很多干货哦~~标记红色的部分为今日更新内容。第三章、使用代理、爬行器和爬虫3.0、介绍3.1、使用DirBuster寻找敏感文件和目录3.2、使用ZAP寻找敏感文件和目录3.3、使用BurpSuite查看和修改请求3.4、使用BurpSuite的Intruder模块发现敏感目录3.5、使用ZAP代理查看和修改请求 3.6、使用ZAP的爬虫功能3.7、使用burp爬取网站页面 3.8、使用BurpSuite的重放功能3.9、WebScarab的使用3.10、从爬行结果中识别相关文件和目录3.9、WebScarab的使用 WebScarab是我们接下来要学习的另一款功能强大的Web代理工具,它深受渗透测试人员的喜欢。在本章节,我们将使用WebScarab来演示对网站的爬取。环境准备默认情况下,WebScarab使用8008监听HTTP请求,所以我们需要配置浏览器的监听端口为8008,配置步骤可以参考OWASPZAP和Burp

  • Spark内核分析之DAGScheduler划分算法实现原理讲解(重要)

            接着上一篇,我们接着来分析下一个非常重要的组建DAGScheduler的运行原理是怎么实现的;通过之前对Spark的分析讲解,我们的Spark作业是在遇到一个action算子以后并以此为界限,划分出一个Job出来,也就是在这个时候,Spark作业向集群提交一个Job任务;下面我们看看源码是如何实现的;sparkJob提交源码图        通过在任何一个action操作的算子中追踪发现,最终提交一个Job是调用了SparkContext的runJob方法实现的,在该方法中通过dagSchedualer.runJob()正式向集群提交一个Job任务,接下来重点来了,我们来看看DAGScheduler是如何对一个Job进行stage划分的;提交任务这里通过eventProcessLoop对象将Job进行提交,下面我们看看在eventProcessLoop中具体发生了什么;1.首先,创建出与partition数量相等的task;2.由触发Job提交的那个RDD算子作为作为起点,创建第一个stage并命名为finalStage;3.对于if条件成立的内容,是针对于本地模式运行

  • sed 学习笔记(转)

    声明:这些代码只是为了学习和理解sed命令而为之,并不代表问题的唯一解或最佳解,希望各位拍砖参考资料:等一.替换1.神奇变换(y命令的使用)代码:sed'y/ori_letter_list/target_letter_list/'filename代码:catfilename1234567890234567890134567890124567890123测试将文件中1换成A将文件中2换成B...将文件中0换成J代码:sed'y/1234567890/ABCDEFGHIJ/'filenameABCDEFGHIJBCDEFGHIJACDEFGHIJABDEFGHIJABC注意变换关系是按两个list的位置对应变换,y是一个管局命令,拒绝使用后缀flag/glist1:1234567890list2:ABCDEFGHIJ下面再作一个与前例相反的变换代码:sed'y/0987654321/ABCDEFGHIJ/'filenameJIHGFEDCBAIHGFEDCBAJHGFEDCBAJIGFEDCBAJIH2.替换每行第一个匹配代码:s

  • 如何优雅地使用Redis之位图操作

    前言在进入今天的主题前,先简单地解释下Redis中的位图到底是什么。Redis官方文档对于位图的介绍如下:位图不是一个真实的数据类型,而是定义在字符串类型上的面向位的操作的集合。由于字符串类型是二进制安全的二进制大对象,并且最大长度是512MB,适合于设置2^32个不同的位。 位操作分为两组:常量时间单个位的操作,像设置一个位为1或者0,或者获取该位的值。对一组位的操作,例如计算指定范围位的置位数量。 位图的最大优势是有时是一种非常显著的节省空间来存储信息的方式。例如,在一个系统中,不同用户由递增的用户ID来表示,可以使用512MB的内存来表示400万用户的单个位信息(例如他们是否需要接收信件)。 简而言之,位图操作是用来操作比特位的,其优点是节省内存空间。为什么可以节省内存空间呢?假如我们需要存储100万个用户的登录状态,使用位图的话最少只需要100万个比特位(比特位1表示登录,比特位0表示未登录)就可以存储了,而如果以字符串的形式存储,比如说以userId为key,是否登录(字符串“1”表示登录,字符串“0”表示未登录)为value进行存储的话,就需要存储100万个字符串了,相比之

  • 用数学为爱情保鲜

    16/5/22数学的力量 爱情数学心得:数学的力量是很强大的,它存在于我们的生活中,影响着我们的生活,无处不在。说得简单一些,数学就是一门研究pattern的艺术,我们试图用公式和方程去描述自然中生活中的规律,而且这个式子越简单越好。这个演讲中,举了一个用数学去寻找爱情的例子, 其实也说出了用数学去构建模型,去思考,去解决问题的三个比较简单但是普遍的模式,就是: 差,概率,因果当你想研究一个问题的时候,总要先清楚,差距在哪里,什么是现状,什么是想要的状态;原因是什么呢,都有什么样的因素,以什么样的形式影响着结果;会有多大的概率可以使结果更好呢,有什么样的阈值。Equationsandsymbolsaren'tjustathing. They'reavoicethatspeaksoutabouttheincrediblerichnessofnature, andthestartlingsimplicityinthepatternsthattwistandturnandwarpandevolveallaroundus, fromhowtheworldworkstohow

  • Javascript即将迎来Optional Chaining

    OptionalChaining现在处于Stage1。它是什么?OptionalChaining使我们能检查一个对象上面是否存在某属性。其它一些语言有类似的特性。C#例如,有NullConditional操作符很像提案中的OptionalChaining。我们为何需要它?你是否曾经在使用对象或数组的属性之前,检查它是否存在吗?如果你不记得,下面展示一下:if(specimen&&specimen.arms&&specimen.arms.length>2) console.log("Thisisprobablyanalien");复制如果我们不做检查,可能会遇到下面的错误:因为,specimen存在,但它没有arms属性。因此,当我们在它身上获取length属性时就会报错。提案是怎样的?取代上面的写法,我们可以使用optionalchaining写出如下代码:if(specimen?.arms?.length>2) console.log("Thisisprobablyanalien");复制不管怎样,我

  • 在Ubuntu/Linux环境下使用MySQL:开放/修改3306端口、开放访问权限「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。一、查看3306端口是否开放netstat-an|grep3306复制如果看到下图这样的,说明端口并未打开:二、修改访问权限进入目录“etc/mysql/mysql.conf.d/”,如下图所示:在这个目录下,有一个配置文件“mysqld.cnf”,如下图所示:发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/178813.html原文链接:https://javaforall.cn

  • Stack的实现

    1publicclassMyStack<AnyType>{ 2privateAnyType[]theItems; 3privatefinalintDEFAULT_CAPACITY=100; 4privateinttop; 5 6 7publicMyStack(){//构造函数,生成空表 8clear(); 9} 10 11publicvoidclear(){//归为默认(清空) 12top=0; 13ensureCapacity(DEFAULT_CAPACITY); 14} 15 16publicvoidensureCapacity(intnewCapacity){//重置表的容量 17AnyType[]oldItems=theItems; 18theItems=(AnyType[])newObject[newCapacity];//****重新分配空间注意使用强制转换的方式进行定义 19for(inti=0;i<top;i++){ 20theItems[i]=oldItems[i]; 21} 22} 23 24publicbooleanisEmpty(){//判断是

  • [线段树 + 数论 + 树状数组]求区间最大公约数 Interval GCD

    区间最大公约数 原题链接:区间最大公约数 题目大意 和线段树的操作差不多,给你一个l,r让你都加d,或者询问你l,r的最大公约数 题目题解 没学过初等数论吃大亏,写了一早上,以后abs一定要加std:: 根据更相减损之术我们知道,\(gcd(x,y)=gcd(x,y-x)\)那么可以拓展出三个数的情况\(gcd(x,y,z)=gcd(x,y-x,z-y)\)这是成立的 因为我们可以构造一个长度为\(n\)的新数列b,这个b是a的差分序列。用线段树维护序列b的区间最大公约数,(和上面的结论一样) 这样一来,我们的查询就解决了直接gcd(a[l],ask(1,l+1,r))(想想为什么?再看看上面的推导公式) 修改的话,很明显在b上是单点修改,在a上也要维护,可以用树状数组维护a值 代码如下 //#definefreyes #include<cmath> #include<cstdio> #include<iostream> #defineintlonglong constintN=500005; structNode{ intl,r; longlo

  • 如何制作手绘地图?如何将图片图层精确地对准在地图上?

    最近大家常常在问,如何制作鼓浪屿手绘地图,如何将气象图层叠加在高德地图上啊? 其实地图上的研发量很小,几行代码就可以搞定。 关键是在图片绘制上,有较高的要求。 下面就用简单粗暴的方法来实现,如有不妥之处,请大家轻喷。   确定图片绘制范围 以鼓浪屿地图为例,打开框选取点工具:http://zhaoziang.com/amap/getBounds.htm 获取到左下角和右上角的坐标,这个就是图片的显示范围。 如下图,3是左下角,1是右上角。 bounds:newAMap.Bounds( [118.057708,24.436293],//左下角 [118.077706,24.454069]//右上角 )复制     制作图片 打开Photoshop,或者您有别的制图软件也可以,开始制作手绘地图吧。 图片的创作您可以任意发挥,每个人都有自己的特色。这里对制作图片就不赘述了。 请注意,绘制的图片,一定和您框选的范围一致!!   绘制过程中,保证绘制内容和底图高度重合! 这里一定要保证图片重合,后期无法通过纠偏、校准等方式对齐图片!一定注意! &

  • 【高中数学】三角函数、解三角形学习笔记

    1三角函数的定义 1.1三角函数 在平面直角坐标系中,角\(\alpha\)的终边和单位圆交于点\(P\),显然对于任意一个\(\alpha\in\text{R}\),$P(x,y)$是唯一确定的,故 \(P(x,y)\)的纵坐标\(y\)称作角\(\alpha\)的正弦函数,记为\(\sin\alpha\); \(P(x,y)\)的横坐标\(y\)称作角\(\alpha\)的余弦函数,记为\(\cos\alpha\); \(P(x,y)\)的纵横坐标之比称作角\(\alpha\)的正切函数,记为\(\tan\alpha\)。 需要注意的是,\(\tan\alpha\)在\(\alpha\in\{\alpha|\alpha=\dfrac{\pi}{2}+k\pi,\k\in\text{Z}\}\)上无意义。 1.2三角函数线 如图,在单位圆中,角\(\alpha\)终边和单位圆交于点\(P\),则有向线段\(\overrightarrow{AP}\)即\(\alpha\)的正弦线;有向线段\(\overrightarrow{OA}\)即\(\alpha\)的余弦线;有向

  • 怎么去掉Xcodeproject中的某种类型的警告 Implicit conversion loses integer precision: &amp;#39;NSInteger&amp;#39; (aka &amp;#39;long&amp;#39;) to &amp;#39;int32

    问题描写叙述  在我们的项目中,通常使用了大量的第三方代码,这些代码可能非常复杂,我们不敢修改他们,但是作者已经停止更新了,当sdk升级或者是编译器升级后,这些遗留的代码可能会出现许很多多的警告,那么我们有没有办法去掉这些烦人的警告,不然一个project几百个警告,你看着怎么都不爽吧.我们怎么去掉警告呢 1.最直接,最一劳永逸,最安全的方式,直接找到警告的那段代码,改为不警告.这个方式,最安全. 但是它有一个问题,就是,当我们非常多文件都有这样的类型的警告的时候,我们就须要修改非常多非常多的源代码了,对于不是我们写的源代码,有可能随时会更新的,我们这样的方式,显然就不太可取了. 2.使用编译器提供的宏来操作,这个方式在我们的project中会大量的看到 #pragmaclangdiagnosticpush #pragmaclangdiagnosticignored"-Wdeprecated-declarations"         //写在这个中间的代码,都不会被编译器提示-Wdepr

  • kubeadm reset 重置

     

  • 离线批处理之Spark

    Spark简介   Spark是基于内存的分布式批处理系统,它把任务拆分,然后分配到多个的CPU上进行处理,处理数据时产生的中间产物(计算结果)存放在内存中,减少了对磁盘的I/O操作,大大的提升了数据的处理速度,在数据处理和数据挖掘方面比较占优势。 Spark应用场景 数据处理(DataProcessing):可以用来快速处理数据,兼具容错性和可扩展性。 迭代计算(IterativeComputation):支持迭代计算,有效应对复杂的数据处理逻辑。 数据挖掘(DataMining):在海量数据基础上进行复杂的挖掘分析,可支持多种数据挖掘和机器学习算法。 流式处理(StreamingProcessing):支持秒级延迟的流处理,可支持多种外部数据源。 查询分析(QueryAnalysis):支持SQL的查询分析,同时提供领域特定语言(DSL)以方便操作结构化数据,并支持多种外部数据源。 Spark对比MapReduce 性能上提升了100倍。 Spark的中间数据放在内存中,对于迭代运算的效率更高;进行批处理时更高效,同时有着更低的延迟。 Spark提供更多的

  • 3D空间中射线与轴向包围盒AABB的交叉检测算法【转】

    引言            在上一节中,我讲述了如何实现射线与三角形的交叉检测算法。但是,我们应该知道,在游戏开发中,一个模型有很多的三角形构成,如果要对所有的物体,所有的三角形进行这种检测,就算现在的计算机运算能力,也是无法高效的完成。所以,我们需要通过其他的手段来提早剔除一些不可能发生交叉的物体,这种早退的思想,大量的运用在3D游戏技术中。在本篇文章中,我将像大家讲述如何实现射线与轴向包围盒AABB的交叉检测。如果读者不明白什么是轴向包围盒,请看这篇文章。       Ray-AABB交叉检测算法            现如今,有很多的Ray-AABB交叉检测算法,这里主要讲述一种称之为"Slabsmethod"的交叉检测算法。          

  • day02 python基础

    今日内容: 1、常用数据类型及内置方法 2、文件处理 3、函数 ,,, 01、列表: 定义:在[]内,可以存放多个任意类型的值,并以逗号隔开。       一般用于存放学生的爱好,课堂的周期等等... ,,, #定义一个学生列表,可以存放多个学生 Students=[‘mx’,‘wq’,‘wzq’] Print(student[1])#mx Student_info=[‘wzq’,21,‘f’,[‘摄影’‘吃’]] #取wzq同学的所有爱好 Print(student_info[3]) #取wzq同学的第二个爱好 Print(student_info[3][1]) #优先掌握的操作: #1、按索引存取值(正向存取+反向存取):即可存也可取 Print(student_info[-2])# #2、(切片,顾头不顾尾,步长) print(student_info[0,4,2])# #3、长度 print(len(student_info)# #4、成员运算in和not in print(‘wzq’ in&nbs

  • Java进阶篇设计模式之二 - 工厂模式

    前言 在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法。本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式、工厂方法和抽象工厂模式。 简单工厂模式 简单工厂模式是属于创建型模式,又叫做静态工厂方法模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。调用只需要告诉工厂类所需要的类型,工厂类就会返回需要的产品类工厂的子类。可以说是工厂模式中最简单的一种。 打个比方,我们在电脑经常玩游戏,我们只需要告诉电脑我们要玩什么游戏,电脑就会打开这个游戏,我们并不需要关心游戏是怎么运作的。我们可以在以下的代码中进行相应的说明。 我们首先创建一个游戏总类接口,包含一个玩游戏的方法;然后再由各自的游戏类继承该类并实现该类的方法,最后在创建一个工程类根据不同的游戏进行创建对象。那么实现的代码如下: 代码示例: classtest{ privatestaticfinalStringLOL="LOL"; privatestaticfinalStringDNF="DNF"; publicstaticvoidmain(String[]args){ Gamegame=Co

  • git merge &amp; git rebase 你用哪一个?

    前言 gitmerge和gitrebase都用来从一个分支获取内容并合并到当前分支,但它们采用不同的策略来进行「合并」操作。 开始之前,我们先来模拟一个日常开发中很常见的场景:假设远程分支dev已经有了两个提交C1和C2,我们基于这个分支创建feature分支进行功能开发。 我们在自己的feature分支上进行开发,并生成了两个commit,分别是C5和C6。但是与此同时,dev分支上也有了一些新的修改并且进行了提交,生成了C3和C4。也就是说,dev分支和feature分支产生了“分叉”。 一般来说,feature分支是为了开发某些特定需求而从dev分支拉取出来的,开发完成后还需要「合并」回dev分支上。所以,这个时候就出现了两种选择:merge或rebase   gitmerge 执行以下命令: gitcheckoutfeature gitmergedev复制 Git会根据两个分支的共同祖先(C2)和它们各自的最新提交(C4和C6)进行一个三方合并,然后将合并中修改的内容生成一个新的commit(mergecommit:),即下图中的C7。

相关推荐

推荐阅读