Fluentd事件的生命周期

什么是事件?

事件(Event)是Fluentd内部处理流程使用的数据结构,日志记录一旦进入Fluentd便被封装成一个event。Event由三部分组成:tag、time、record。

tag标识事件的来源,或者说类型,用于内部消息路由,即后续交由哪个插件处理;

time是事件的发生时间;

record为日志的实际内容,这是一个JSON对象。

Input插件负责将源数据封装为event,比如in_tail插件从文本中生成event。对于下边这行文本:

192.168.0.1 - - [28/Feb/2013:12:00:00 +0900] "GET / HTTP/1.1" 200 777

将会产生下边的event对象:

tag: apache.access    #根据插件的tag参数来设置

time: 1362020400      # 28/Feb/2013:12:00:00 +0900

record: {"user":"-","method":"GET","code":200,"size":777,"host":"192.168.0.1","path":"/"}    #根据in_tail插件中的parse项来决定如何解析单行日志记录,并生成相应的JSON对象

下边我们通过一个具体的配置来讲解事件的处理过程。

本例使用一个很基础的配置片段来描述各插件是如何关联到一起的,它包括了如何定义输入源(或者说监听器),以及如何设置通用的匹配规则将event路由到输出端。

我们使用in_http和out_stdout这两个插件来描述event的循环过程。

<source> @type http port 8888 bind 0.0.0.0</source>

上边的配置使用in_http插件定义了一个HTTP服务器,监听端口为8888。然后我们再定义一个匹配(Match)规则,event路由引擎会根据这个规则将http请求派发到输出端。这里的输出端是stdout,仅仅将http请求打印到屏幕上。

<match test.cycle> @type stdout </match>

Match的作用是设置一个匹配规则test.cycle,对于每个进入Fluentd的event,如果其tag值和test.cycle相等(或者说匹配,因为match可以使用通配符。这里的tag是由in_http插件生成的。),那么这个event就会进入此match定义的output插件,本例中的output插件就是out_stdout。

至此,我们定义了三个基本项:Input、Match和Output,虽然仅仅使用两个配置段。这就是一个可以使用的采集配置了,可以通过以下命令进行测试:

curl -i -X POST -d 'json={"action":"login","user":2}' http://localhost:8888/test.cycle

    你会看到如下输出:

    HTTP/1.1 200 OKContent-Type: text/plainConnection: Keep-AliveContent-Length: 0

    在/var/log/td-agent.log中会有如下输出:

    2020-03-05 14:06:24.144168913 +0800 test.cycle: {"action":"login","user":2}
    下边我们开始了解一下事件是如何被处理和改变的。
    当你准备好一个采集配置后,Fluentd就生成了用以处理输入数据的各种规则。日志事件会历经一系列的处理流程,从而决定了事件的循环周期。
    • 过滤器(Filters)

    • 过滤器用于对事件进行筛选,决定是否接收或者丢弃事件。我们可以在上边的示例中增加一个过滤器。

      <source> @type http port 8888 bind 0.0.0.0</source>
      <filter test.cycle> @type grep <exclude> key action pattern ^logout$ </exclude></filter>
      <match test.cycle> @type stdout</match>

      添加过滤器之后,事件在路由到match之前必须经过过滤器的处理。过滤器根据事件的类型和过滤规则来决定是否接受此事件。

      我们示例中使用的是grep过滤器,这个过滤器对test.cycle这类事件进行过滤,会排除http请求中action值为logout的事件。

      所以,如果尝试发送下边的请求,在td-agent.log中是看不到任何输出的。

      curl -i -X POST -d 'json={"action":"logout","user":2}' http://localhost:8888/test.cycle

      从示例中可以看到,事件是根据配置顺序自上而下来被处理的。我们可以根据需要配置任意多个过滤器,这样一来,配置文件会变得很长很复杂。Fluentd提供了标签来解决此问题。

    • 标签(Labels)

      标签的作用是用来定义一组配置项,这组配置项可以被其他配置项引用,从而实现事件路由跳转。类似编程语言中的goto的功能。

      还是上边的示例,我们定义一个标签来看一下效果。

      <source> @type http bind 0.0.0.0 port 8888 @label @STAGING</source>
      <filter test.cycle> @type grep <exclude> key action pattern ^login$ </exclude></filter>
      <label @STAGING> <filter test.cycle> @type grep <exclude> key action pattern ^logout$ </exclude> </filter>
      <match test.cycle> @type stdout </match></label>

      这个STARTING标签将之前的filter和match封装到了一起,然后在source中进行了引用。如此一来,事件由input插件生成后将会跳过那个独立的filter,直接进入STARTING定义的处理流程中。

      这种效果可以让我们实现一些特定的处理逻辑,让事件快速到达指定目的地。

    • 缓存(Buffers)

      我们看到了事件从input产生,经由filter筛选,最后到达output的过程。在上边的示例中,我们使用的是stdout插件直接输出到控制台,并没有经过缓存。

      实际应用中,一般会先把数据进行缓存,达到一定条件后再flush到目标存储中。这样可以提升系统可靠性,对于稳定系统吞吐量也很重要。可在后续文章中共同了解更多关于缓存插件的知识。

总的来说,事件会在各插件之间接续流转,直到到达output,结束整个生命周期。如下图:
(0)

相关推荐

  • 云原生系列5 容器化日志之EFK

    上图是EFK架构图,k8s环境下常见的日志采集方式. 日志需求 1 集中采集微服务的日志,可以根据请求id追踪到完整的日志: 2 统计请求接口的耗时,超出最长响应时间的,需要做报警,并针对性的进行调优 ...

  • 号称下一代日志收集系统!来看看它有多强

    后面随着架构的优化与演进,又引入另一个轻量级的组件 Filebeat,Filebeat和Logstash一样属于日志收集处理工具,基于原先 Logstash-fowarder 的源码改造出来的.与Lo ...

  • 员工生命周期管理

    员工的生命周期是什么? 员工生命周期是涵盖了员工与其工作所在组织之间的整个关系,这包括吸引阶段,即人们熟悉公司的过程,一直持续到他们离开组织为止.    在员工与企业之间这种持续关系中,我们分为7个阶 ...

  • 动力电池全生命周期管理

    动力电池全生命周期管理

  • 【原创】基于生命周期的工艺验证之工艺设计阶段

    手把手教您把控技术转移.工艺验证和清洁验证的相互关系学习通道扫描右方二维码即刻报名01 基于生命周期的工艺验证 基于生命周期的工艺验证方法,将工艺研发/设计.商业生产工艺验证.常规商业化生产中控制状态 ...

  • 企业在不同的时期,生存法则是不一样的,如何突破生命周期呢?

    △是新朋友吗?记得先给余导说商点个关注哦- 我们一个人的生命周期有婴儿期, 发育期.青春期.成长期, 然后有可能不长身高了,慢慢步入成熟期. 公司和人一样,也会经历这么一个过程. 每个时期有每个时期不 ...

  • 一文读懂用户全生命周期?

    诸葛君说:诸葛io以用户为中心,打通用户全生命周期数据,构建完整的用户画像并提供营销工具和分析平台,从而为企业实现数据驱动的精准营销和精细化运营提供完整的解决方案. 在诸葛io赋能企业提供精准营销和精 ...

  • 诸葛io CEO孔淼:用户全生命周期 数据赋能下的新营销(附PPT)

    诸葛君说:9月18日,诸葛io CEO孔淼出席WAW X十年数据峰会,并发表主题为<用户全生命周期 数据赋能下的新营销>的演讲,讲述了现在企业面临的获客难,转化低的难题,以及诸葛io三年来 ...

  • 诸葛全面升级「数据接入」,打破数据孤岛,洞察用户全生命周期

    企业数字化的主要特征包括三个方面:第一是连接,连接员工.连接客户.连接机器设备:第二是数据,也就是连接之后实时产生的数据:第三是智能,是数据驱动的智能应用. 2020年,新技术发展的脚步并没有因为疫情 ...

  • 客户全生命周期价值,如何驱动To B业务增长?

    | 全文共 2832 字 | 预计阅读时长 8 分钟 近两年,中国数字经济市场发生了很多变化,随着经济增速持续放缓.人力成本持续攀升,伴随移动互联网的高速发展,倒逼企业重视管理效率的提升,互联网巨头加 ...

  • 企业和产品都有生命周期,如何在倒下之前找到新的盈利突破点?

    △是新朋友吗?记得先给余导说商点个关注哦- 当你开始赚钱,进入成长期, 到了成长期,那么竞争对手一定越来越多. 我们在创业的时候, 你会发现,你是感觉不到竞争对手的. 因为你总是在挑战别人, 你是站在 ...