文章目录

    • 引言
    • 安装
      • 推荐的安装方式:
      • 其他安装方式的采坑
      • 测试验证
    • 学习过程
      • 1. 先学习一个简单的采集示例:
      • 2. 学习一下fluentd相关的关键字配置。
    • 日志接入实践
    • 总结

引言

Fluentd是一个通用的数据收集框架,通常用来作为统一的日志处理平台,这篇文章主要记录Fluentd的学习与使用过程,也包括一些采坑的点,和大家分享经验。

安装

安装一个fluentd的环境是一个基本操作, 最有价值的参考信息当然是fluentd的指导文档了,URL链接为: https://docs.fluentd.org/installation
笔者使用的Euler2.9的环境, 在安装过程中遇到了一些坑。

推荐的安装方式:

推荐使用rpm包的方式安装td-agent— fluentd的一个稳定发布版本(stable distribution)
推荐原因: 简单方便, 不需要安装ruby通过gem安装。

安装指导:
主要可以参考:https://docs.fluentd.org/installation/install-by-rpm

要点:

  • 获取安装脚本:
# td-agent 4
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent4.sh | sh
  • 使用的是Euler2.9的操作系统,运行脚本会报错,因此修改脚本的内容, 使得/etc/yum.repos.d/td.repo的$releasever 的值为 8, 然后重新运行脚本即可。
  • 启动服务,即可运行
sudo systemctl restart td-agent.service
  • 默认的配置文件位置:
    /etc/td-agent/td-agent.conf

其他安装方式的采坑

总结:

  • 安装的难易很大程度上取决于操作系统,有的操作系统可能只需要几行命令就可以安装成功了。
  • 使用ruby gem的安装方式,看似简单, 主要就两个命令:
yum install ruby
gem install fluentd --no-doc

但是这两个命令对euler操作系统并不友好,遇到如下报错, 尝试解决未果

mkmf.rb can't find header files for ruby at /usr/share/include/ruby.h
  • 使用docker安装的方式, 主要是遇到了权限不足的错误,可能是配置文件的设置不对, 也是尝试解决未果。
docker pull fluent/fluentd:v1.7-1docker run -p 8888:8888 --rm -v $(pwd)/etc:/fluentd/etc -v $(pwd)/log:/fluentd/log fluent/fluentd:v1.7-1 -c /fluentd/etc/fluentd_basic_setup.conf -v

测试验证

td-agent默认配置了 8888端口的监听,可以用于测试

curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
tail -n 1 /var/log/td-agent/td-agent.log

效果:

2022-08-02 20:30:50.129095885 +0800 debug.test: {"json":"message"}

学习过程

参考文档:
http://t.zoukankan.com/wzs5800-p-13528430.html

需求推动学习, 描述一下自己在实践中遇到的需求:

目的: 将日志自动接入到日志平台中。

先通过几个简单的示例熟悉这个中间件的使用。

1. 先学习一个简单的采集示例:

<source>@type tailpath /home/fluentd/test.logpos_file /var/log/td-agent/test.postag fluent.test<parse>@type none</parse>
</source>
<match **>@type stdout
</match>
  • 通过tail的方式跟踪日志文件/home/fluentd/test.log,将其输出到控制台终端。
  • 在中指定了输入插件in_tail,在中指定了输出插件out_stdout
  • 为了识别日志格式,in_tail插件需要设置一个Parser插件,通过将parser.type设置为none,告诉td-agent日志为单列文本。
  • pos_file 会记录日志的行数, 是必选项目。

2. 学习一下fluentd相关的关键字配置。

source: 配置数据的来源

# Receive events from 24224/tcp
# This is used by log forwarding and the fluent-cat command
<source>@type forwardport 24224
</source># http://<ip>:9880/myapp.access?json={"event":"data"}
<source>@type httpport 9880
</source>

可以添加的数据配置

tag: myapp.access # 指定数据的方向
time: (current time) # 时间
record: {“event”:“data”} # 记录,json格式
match: 指定输出的方向

match: 可以设置日志的输出

下面的例子可以通过发送http请求来获取日志

# http://<ip>:9880/myapp.access?json={"event":"data"}
<source>@type httpport 9880
</source># Match events tagged with "myapp.access" and
# store them to /var/log/fluent/access.%Y-%m-%d
# Of course, you can control how you partition your data
# with the time_slice_format option.
<match myapp.access>@type filepath /var/log/fluent/access
</match>

下面的例子是 把nginx 日志传入到kafka

<source>@type tcpport 1517bind 0.0.0.0tag nginx<parse>@type syslog</parse>
</source><match nginx>@type kafka2brokers 1.2.3.4:9092use_event_time false<format>@type json</format>topic_key nginx_logdefault_topic nginx_log
</match>

发现有几个标签的功能不是特别了解,在这里补充一下

@type    :  表示输入的插件
@label   :  个人理解是为了简化tag的路由。 在<source>中指定了输入和label, 而label又关联了对应的filter和match, 这样可以简化逻辑。
<parse></parse> : 可以用于<source> <match> <filter>中, 是一个解析插件, 可以解析csv, nginx, json等格式的数据。  
<format></format> : 用于<match><filter>中, 输出为csv,json等格式,作用是输出的格式化。 

日志接入实践

  • fluntd如何把日志传入到kafka
    前提条件, 需要有一个kafka的环境(需要自行安装一个并运行)

如果kafa作为数据生产者的话,可以通过如下方式进行消息传播
发送消息:
bin/kafka-console-producer.sh –broker-list localhost:9092 –topic test

在这里, 可以把fluentd看作生产者, 那么如何进行fluentd的配置呢?

需求场景:
环境中会记录一些日志, 日志信息追加到某个特定的日志文件 test.log中, 下面希望配置fluentd和kafka对接,配置文件如下:

<source>@type tailpath /opt/test/test.logpos_file /var/log/td-agent/test.postag nuclei<parse>@type regexpexpression /^\[(?<logtime>[^\]]*)\] \[(?<vul_name>[^\]]*)\] \[(?<protocal>[^\]]*)\] \[(?<level>[^\]]*)\] (?<url>[^ ]*)(?<detail>.*)$/</parse>
</source><match nuclei>@type kafka2brokers  ip:portuse_event_time false<format>@type json</format>topic_key nucleidefault_topic nuclei
</match>

调试总结:

  • match是一对一的关系, 也就是说一个source只能对应一个match, 多个的话不生效?
  • tail 方式kafka接收消息不是实时的, 可能有一点的延迟
  • 日志路径的权限也很重要, 需要保证fluentd可以读取。
  • 不是所有消息都会打日志的, 主要还是看数据的流向是哪里。

对于各种格式的匹配, 建议使用正则的方式。

正则的调试可以在下面网址进行:
https://rubular.com/r/xfQHocREGj

总结

在实践中重点关注了tail 方式收集日志,fluentd 还支持其他许多种输入的方式,