轻量级日志收集转发 | fluent-bit指令详解(一)

2020-06-15 11:10:48 浏览数 (1)

"本文主要对fluent-bit 1.3版本指令做详细介绍,关注后回复【pdf】获得文档"

1、回顾

随着集群规模不断扩大,日志收集问题将一直萦绕在我们耳边,前段时间我用四篇文章安利了使用fluentd及fluent-bit好处,具体可以参考如下链接:

  • Kubernetes日志收集解决方案
  • Kubernetes集群环境下fluentd日志收集方案介绍
  • 日志收集工具fluentd安装配置及使用介绍
  • 一文了解日志收集工具fluent-bit

下面我就直接介绍fluent-bit整体收集架构和插件,如果对整体有不理解的部分,可以参考如上链接。

2、插件介绍

整体功能流程如下图所示:

插件

描述

Input

数据入口点,通过输入插件实现,此接口允许收集和接收数据,比如日志文件、TCP上报数据等。

Parser

Parser能够把从input接口获取的非结构化数据进行格式化操作,Parser是可选的,具体取决于Input输入插件。

Filter

Filter是过滤器插件,它允许修改input插件提取的数据。

Buffer

默认情况下,Buffer把Input插件的数据缓存在内存当中,直到路由并传递到output接口为止。

Routing

用于标记Input接口获取的数据,根据规则匹配把数据路由到什么位置。

OutPut

OutPut用于定义数据目的地和目的地输出插件,注意:借助于Routing插件可以把数据输出到多个目的地。

3、fluent-bit插件详细介绍

3.0、Input

fluent-bit提供了各种各样的日志插件来收集不同来源的日志文件,比如可以从日志文件收集、操作系统收集一些度量数据。当Input插件被加载以后,fluent-bit会在内部创建一个实例,每个实例都有自己独立的配置,这些配置我们通常称作它的属性。

Input定义了输入源信息,如下所示Input相关配置信息,注意每个Input插件都可以定义自己的配置键。

key

value

Name

Input输入标签名称

Tag

Input插件产生记录标签名称

Name是必填项,它使Fluent-bit知道应该加载那个输入插件,除输入和转发插件外,其它插件Name都是必填项。使用示例如下所示:

代码语言:javascript复制
[INPUT]
    Name cpu
    Tag  my_cpu

3.1、Parser

实际情况下,原始字符串的使用是一件很痛苦的事情,通常情况下,我们期望在收集到输入数据后立刻转换为结构化的数据,默认可以处理Apche、Nginx、Docker等日志。

通过以下实例(Apache HTTP服务器)可以看出非结构化的数据转换为结构化数据的过程:

代码语言:javascript复制
192.168.2.20 - - [28/Jul/2006:10:27:10 -0300] "GET /cgi-bin/try/ HTTP/1.0" 200 3395

上面的日志行是没有经过任何处理的原始日志,理想情况下我们可以把它转换为日后可以轻松处理的结构化数据,如果使用正确的配置,我们可以把日志转换为如下格式:

代码语言:javascript复制
{
  "host":    "192.168.2.20",
  "user":    "-",
  "method":  "GET",
  "path":    "/cgi-bin/try/",
  "code":    "200",
  "size":    "3395",
  "referer": "",
  "agent":   ""
 }

解析器是完全可以配置的,并且可以由每个输入插件独立且可选的方式进行处理。

具体配置使用示例,如下所示:

代码语言:javascript复制
[PARSER]
    Name        docker
    Format      json
    Time_Key    time
    Time_Format %Y-%m-%dT%H:%M:%S.%L
    Time_Keep   On


[PARSER]
    Name        syslog-rfc5424
    Format      regex
    Regex       ^<(?<pri>[0-9]{1,5})>1 (?<time>[^ ] ) (?<host>[^ ] ) (?<ident>[^ ] ) (?<pid>[-0-9] ) (?<msgid>[^ ] ) (?<extradata>([(.*)]|-)) (?<message>. )$
    Time_Key    time
    Time_Format %Y-%m-%dT%H:%M:%S.%L
    Time_Keep   On
    Types pid:integer

3.2、Filter

生产环境中,我们要完全控制我们需要收集的数据,Filter是一个很重要的特性,它能够保证数据在没有到达目的地之前对其进行修改。Filter是通过插件进行实现的,因此每个可用的标记都可以用来匹配,过滤或丰富特定元数据的日志。

Filter和Input非常类似,它在实例上下文中运行,有着自己独立的配置,如下所示是Filter相关配置信息:

key

desc

Name

过滤器名称

Match

与传入记录标签匹配的模式,它区分大小写,并可以用 * 作为通配符。

Match_Regex

与传入记录标签匹配的正则表达式,如果要使用完整的正则表达式语法,请使用此选项。

Name是必填项,它使fluent-bit知道应该加载那个插件,Match和Match_Regex是匹配模式插件,如果两者同时定义,以Match_Regex优先。使用示例如下所示:

代码语言:javascript复制
[FILTER]
    Name  stdout
    Match *

3.3、Buffer

Buffer在fluent-bit中是一个可供选择的缓冲机制,该机制能够充当数据备份系统,以避免系统故障导致的数据丢失。

fluent-bit最终目标是收集、解析、过滤、最终把日志发到中心位置,在此过程中存在多个阶段,而关键的功能之一就是缓冲的能力,即把处理后的数据存放在临时位置,随时可以发送到最终位置。默认情况下,fluent-bit在处理数据时,使用内存进行存储记录和临时位置,但是在理想情况下,是在文件系统中提供持久化存储机制,以保证数据的聚合和安全功能。

从fluent-bit 1.0开始,fluent-bit提供了新的存储层,该存储层可以是内存也可以是文件系统,可以在输入插件中进行配置启用。

注意:缓存的数据不在是默认的日志数据格式,而是fluent-bit内部二进制表示形式。

Buffer有两个区域需要配置,如下:

  • Service
  • INPUT

可以在Service Section配置一个全局存储变量,在Input Section定义使用什么机制。

Service相关的配置信息如下所示:

Key

Description

Default

storage.path

在文件系统中配置一个可选位置用于存储数据流和数据块,如果未设置此参数,那么只能使用内存作为缓存。

storage.sync

开启数据同步到文件存储系统,可以配置normal和full两种配置。

正常

storage.checksum

从文件系统中读取或写入数据时启用完整性检查,存储层使用CRC32算法。

关闭

storage.backlog.mem_limit

如果设置了storage.path,fluent-bit会查找尚未分发出去的数据块,这些数据块称之为积压数据,此配置用来控制处理这些积压数据时占用系统内存大小。

5M

Service部分示例如下:

代码语言:javascript复制
[SERVICE]
    flush                     1
    log_Level                 info
    storage.path              /var/log/flb-storage/
    storage.sync              normal
    storage.checksum          off
    storage.backlog.mem_limit 5M

如上所示配置了一个缓冲机制,缓冲区路径/var/log/flb-storage/,它将使用正常的同步模式,没有校验和,并且在处理积压数据时最大可以使用5M内存。

Input部分配置信息如下所示:

Input插件可以配置如下可选存储配置项,下表描述了可选的配置:

Key

Description

Default

storage.type

指定要使用的缓冲机制,内存或者文件系统

内存

如下所示配置了一个缓冲服务的功能,两个Input插件,第一个文件系统,第二个内存。

代码语言:javascript复制
[SERVICE]
    flush                     1
    log_Level                 info
    storage.path              /var/log/flb-storage/
    storage.sync              normal
    storage.checksum          off
    storage.backlog.mem_limit 5M


[INPUT]
    name          cpu
    storage.type  filesystem


[INPUT]
    name          mem
    storage.type  memory

3.4 、Routing

它是一项核心功能,可以通过过滤器把数据路由到一个或者多个目的地。

路由中有两个重要概念:

Tag:当数据由输入插件生成时,它会附带一个标签(大多数情况下是人为手动配置该标签),该标签是用户可读的指示器,有助于识别数据源。

Match:它在输出插件中指定,主要用于定义当前数据路由目的地。

参考以下示例,该示例旨在把CPU信息路由到ES数据仓库,内存信息传递到标准输出接口。

代码语言:javascript复制
[INPUT]
    Name cpu
    Tag  my_cpu


[INPUT]
    Name mem
    Tag  my_mem


[OUTPUT]
    Name   es
    Match  my_cpu


[OUTPUT]
    Name   stdout
    Match  my_mem

路由会自动读取输入规则和输出匹配标签,如果一些数据输入标签和输出标签不匹配,那么该数据将被忽略。

路由具有足够的灵活性,以支持通配符的匹配模式。下面这个例子说明了两个数据源共同定义了一个目的地。

代码语言:javascript复制
[INPUT]
    Name cpu
    Tag  my_cpu


[INPUT]
    Name mem
    Tag  my_mem


[OUTPUT]
    Name   stdout
    Match  my_*

匹配规则设置成my_*,那么意味着,它将匹配所有以my_开头的数据。

3.5、OUTPUT

它用于定义数据的输出目的地。目的地可以是远程服务、本地文件系统、或其它可用的标准接口。OutPut有很多可用的输出插件实现。加载输出插件后,将创建一个独立的实例,每个实例都有自己独立的配置。OUTPUT支持以下属性配置:

Key

Desc

Name

输出插件的名称

Match

与传入记录标签匹配的模式,它区分大小写,并可以用 * 作为通配符。

Match_Regex

与传入记录标签匹配的正则表达式,如果要使用完整的正则表达式语法,请使用此选项。

如下所示是OUTPUT的使用示例:

代码语言:javascript复制
[OUTPUT]
    Name  stdout
    Match my*cpu

如下所示是收集CPU指标示例:

代码语言:javascript复制
[SERVICE]
    Flush     5
    Daemon    off
    Log_Level debug


[INPUT]
    Name  cpu
    Tag   my_cpu


[OUTPUT]
    Name  stdout
    Match my*cpu

4、Service

运行于整个数据链的输入和输出;比如可以配置为fluent-bit是否为守护进程、过滤日志记录、刷新间隔等。

Service定义了服务的全局属性,通过下表可以说明当前版本可用的属性:

键值

描述

默认值

Flush

设置flush时间(以秒为单位)每次超时,fluent-bit都会把数据刷新到输出插件中。

5

Daemon

一个布尔值,用于设置fluent-bit是否为守护进程(后台运行),允许使用yes, no, on 和 off

Log_File

可选日志文件的绝对路径

Log_Level

设置日志记录的详细程度,允许使用error, warning, info, debug 和 trace. 注意只有WITH_TRACE启用的情况下trace模式才可用。

Parsers_File

Parsers配置路径,可使用多个Parsers_File路径

Plugins_File

插件配置路径,可以配置外部插件

Streams_File

流处理器配置文件路径

HTTP_Server

启用内置Http服务器

HTTP_Listen

启用Http监听端口

0.0.0.0

HTTP_Port

tcp端口

2020

Coro_Stack_Size

设置协程堆栈大小(以字节为单位)。该值应该大于允许系统页面大小,不要设置太小,否则协程可能会超出堆栈缓冲区

24576

使用示例如下:

代码语言:javascript复制
[SERVICE]
    Flush           5
    Daemon          off
    Log_Level       debug

5、总结

本文主要详细介绍了fluent-bit从输入到输出过程中使用的插件。下文我会继续分享各个插件Configuration配置、Include信息含义及使用,敬请期待。

0 人点赞