search
数据采集 采集源配置 tailf 日志采集

tailf 日志采集

简介

采集文件尾部数据(类似tail -f),上报到 DataFlux 中。

前置条件

配置

进入 DataKit 安装目录下的 conf.d/log 目录,复制 tailf.conf.sample 并命名为 tailf.conf。示例如下:

[[inputs.tailf]]
    # 日志文件列表,可以指定绝对路径,支持使用 glob 规则进行批量指定
    # 推荐使用绝对路径
    logfiles = ["/tmp/tailf_test/**/*.log"]

    # 文件路径过滤,使用 glob 规则,符合任意一条过滤条件将不会对该文件进行采集
    ignore = [""]

    # 从文件首部开始采集,当此参数为 true 时,采集器会关闭自动发现文件的功能
    from_beginning = false

    # 数据来源,如果为空,则默认使用 'default'
    source = ""

    # 新增标记tag,如果为空,则默认使用 $source
    service = ""

    # pipeline 脚本路径,如果为空将使用 $source.p,如果 $source.p 不存在将不使用 pipeline
    pipeline = ""

    ## 解释文件内容时所使用的的字符编码,如果设置为空,将不进行转码处理
    ## 注意不要选错编码,否则会导致数据无法正常显示
    ## ex: character_encoding = "utf-8"
    ##     character_encoding = "utf-16le"
    ##     character_encoding = "utf-16be"
    ##     character_encoding = "gbk"
    ##     character_encoding = "gb18030"
    ##     character_encoding = ""
    #character_encoding = ""

    ## 设置正则表达式,例如 ^\d{4}-\d{2}-\d{2} 行首匹配 YYYY-MM-DD 时间格式
    ## 符合此正则匹配的数据,将被认定为有效数据,否则会累积追加到上一条有效数据的末尾
    ## 使用3个单引号 '''this-regexp''' 避免转义
    ## 正则表达式链接:https://golang.org/pkg/regexp/syntax/#hdr-Syntax
    match = '''^\S'''

    # 自定义 tags
    # [inputs.tailf.tags]
    # tags1 = "value1"

match 示例

原数据

2020-10-23 06:41:56,688 INFO demo.py 1.0
2020-10-23 06:54:20,164 ERROR /usr/local/lib/python3.6/dist-packages/flask/app.py Exception on /0 [GET]
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
ZeroDivisionError: division by zero
2020-10-23 06:41:56,688 INFO demo.py 5.0

match 配置 ^\d{4}-\d{2}-\d{2}.*

结果数据

testing,filename=/tmp/094318188 message="2020-10-23 06:41:56,688 INFO demo.py 1.0" 1611746438938808642
testing,filename=/tmp/094318188 message="2020-10-23 06:54:20,164 ERROR /usr/local/lib/python3.6/dist-packages/flask/app.py Exception on /0 [GET]
Traceback (most recent call last):
  File \"/usr/local/lib/python3.6/dist-packages/flask/app.py\", line 2447, in wsgi_app
    response = self.full_dispatch_request()
ZeroDivisionError: division by zero
" 1611746441941718584
testing,filename=/tmp/094318188 message="2020-10-23 06:41:56,688 INFO demo.py 5.0" 1611746443938917265

原数据的第3行至第6行,在经过 match 处理后,被追加到有效的第2行的末尾。

pipeline 配置和使用

pipeline 文档

使用 pipeline 功能时,取其中的 time 字段作为此条数据的产生时间。如果没有 time 字段或解析此字段失败,默认使用当前时间

数据必须含有 status 字段。如果使用 pipeline 功能时且得到有效的 status,将在,否则默认使用"info"

有效的 status 字段值(不区分大小写):

status 有效字段值 对应值
a, alert alert
c, critical critical
e, error error
w, warning warning
n, notice notice
i, info info
d, debug, trace, verbose debug
o, s, OK OK

示例:

# 文本数据:12115:M 08 Jan 17:45:41.572 # Server started, Redis version 3.0.6

# pipeline:
add_pattern("date2", "%{MONTHDAY} %{MONTH} %{YEAR}?%{TIME}")
grok(_, "%{INT:pid}:%{WORD:role} %{date2:time} %{NOTSPACE:serverity} %{GREEDYDATA:msg}")
group_in(serverity, ["#"], "warning", status)
cast(pid, "int")
default_time(time)

# 最终结果:
# {
#     "message": "12115:M 08 Jan 17:45:41.572 # Server started, Redis version 3.0.6",
#     "msg": "Server started, Redis version 3.0.6",
#     "pid": 12115,
#     "role": "M",
#     "serverity": "#",
#     "status": "warning",
#     "time": 1610127941572000000
# }

如果配置文件中 pipeline_path 为空,默认使用 $source.p

如果 $source.p 不存在,将不使用 pipeline 功能

所有 pipeline 脚本文件,统一存放在 datakit 安装路径下的 pipeline 和 pattern 文件夹中,具体写法请看文档

默认情况下,采集器会自动发现新文件,以确保符合规则的新文件能够尽快采集。注意,当 from_beginning 为 true,将强制关闭自动发现文件功能,否则会出现数据重复的问题。

glob 规则简述(图表数据来源

通配符 描述 例子 匹配 不匹配
* 匹配任意数量的任何字符,包括无 Law* Law, Laws, Lawyer GrokLaw, La, aw
? 匹配任何单个字符 ?at Cat, cat, Bat, bat at
[abc] 匹配括号中给出的一个字符 [CB]at Cat, Bat cat, bat
[a-z] 匹配括号中给出的范围中的一个字符 Letter[0-9] Letter0, Letter1 … Letter9 Letters, Letter, Letter10
[!abc] 匹配括号中未给出的一个字符 [!C]at Bat, bat, cat Cat
[!a-z] 匹配不在括号内给定范围内的一个字符 Letter[!3-5] Letter1… Letter3 … Letter5, Letterxx

另需说明,除上述 glob 标准规则外,采集器也支持 ** 进行递归地文件遍历,如示例配置所示。

示例数据

指标说明:

指标 类型 单位
filename tags string
host tags string
service tags string
message fields string
status fields string
abc filename=/tmp/test.t,host=ubuntu-sev,service=abc message="this is log content 1",status="info" 1590399226185118010
abc filename=/tmp/test.t,host=ubuntu-sev,service=abc message="this is log content 2",status="info" 1590399226385218167
abc filename=/tmp/test.t,host=ubuntu-sev,service=abc message="this is log content 3",status="info" 1590399226585314775
abc filename=/tmp/test.t,host=ubuntu-sev,service=abc message="this is log content 4",status="info" 1590399226785420725
abc filename=/tmp/test.t,host=ubuntu-sev,service=abc message="this is log content 5",status="info" 1590399226985528809
abc filename=/tmp/test.t,host=ubuntu-sev,service=abc message="this is log content 6",status="info" 1590399227185633882
abc filename=/tmp/test.t,host=ubuntu-sev,service=abc message="this is log content 7",status="info" 1590399227385747017
abc filename=/tmp/test.t,host=ubuntu-sev,service=abc message="this is log content 8",status="info" 1590399227585893074