文章目录
引言
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
- 1
- 2
- 3
- 使用的是Euler2.9的操作系统,运行脚本会报错,因此修改脚本的内容, 使得/etc/yum.repos.d/td.repo的$releasever 的值为 8, 然后重新运行脚本即可。
- 启动服务,即可运行
sudo systemctl restart td-agent.service
- 1
- 默认的配置文件位置:
/etc/td-agent/td-agent.conf
其他安装方式的采坑
总结:
- 安装的难易很大程度上取决于操作系统,有的操作系统可能只需要几行命令就可以安装成功了。
- 使用ruby gem的安装方式,看似简单, 主要就两个命令:
yum install rubygem install fluentd --no-doc
- 1
- 2
但是这两个命令对euler操作系统并不友好,遇到如下报错, 尝试解决未果
mkmf.rb can't find header files for ruby at /usr/share/include/ruby.h
- 1
- 使用docker安装的方式, 主要是遇到了权限不足的错误,可能是配置文件的设置不对, 也是尝试解决未果。
docker pull fluent/fluentd:v1.7-1 docker 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
- 1
- 2
- 3
测试验证
td-agent默认配置了 8888端口的监听,可以用于测试
curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.testtail -n 1 /var/log/td-agent/td-agent.log
- 1
- 2
效果:
2022-08-02 20:30:50.129095885 +0800 debug.test: {"json":"message"}
- 1
学习过程
参考文档:
http://t.zoukankan.com/wzs5800-p-13528430.html
需求推动学习, 描述一下自己在实践中遇到的需求:
目的: 将日志自动接入到日志平台中。
先通过几个简单的示例熟悉这个中间件的使用。
1. 先学习一个简单的采集示例:
<source> @type tail path /home/fluentd/test.log pos_file /var/log/td-agent/test.pos tag fluent.test <parse> @type none </parse></source><match **> @type stdout</match>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 通过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 forward port 24224</source># http://<ip>:9880/myapp.access?json={"event":"data"}<source> @type http port 9880</source>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
可以添加的数据配置
tag: myapp.access # 指定数据的方向
time: (current time) # 时间
record: {“event”:“data”} # 记录,json格式
match: 指定输出的方向
match: 可以设置日志的输出
下面的例子可以通过发送http请求来获取日志
# http://<ip>:9880/myapp.access?json={"event":"data"}<source> @type http port 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 file path /var/log/fluent/access</match>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
下面的例子是 把nginx 日志传入到kafka
<source> @type tcp port 1517 bind 0.0.0.0 tag nginx <parse> @type syslog </parse></source><match nginx> @type kafka2 brokers 1.2.3.4:9092 use_event_time false <format> @type json </format> topic_key nginx_log default_topic nginx_log</match>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
发现有几个标签的功能不是特别了解,在这里补充一下
@type : 表示输入的插件@label : 个人理解是为了简化tag的路由。 在<source>中指定了输入和label, 而label又关联了对应的filter和match, 这样可以简化逻辑。<parse></parse> : 可以用于<source> <match> <filter>中, 是一个解析插件, 可以解析csv, nginx, json等格式的数据。 <format></format> : 用于<match><filter>中, 输出为csv,json等格式,作用是输出的格式化。
- 1
- 2
- 3
- 4
日志接入实践
- fluntd如何把日志传入到kafka
前提条件, 需要有一个kafka的环境(需要自行安装一个并运行)
如果kafa作为数据生产者的话,可以通过如下方式进行消息传播
发送消息:
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
在这里, 可以把fluentd看作生产者, 那么如何进行fluentd的配置呢?
需求场景:
环境中会记录一些日志, 日志信息追加到某个特定的日志文件 test.log中, 下面希望配置fluentd和kafka对接,配置文件如下:
<source> @type tail path /opt/test/test.log pos_file /var/log/td-agent/test.pos tag nuclei <parse> @type regexp expression /^\[(?<logtime>[^\]]*)\] \[(?<vul_name>[^\]]*)\] \[(?<protocal>[^\]]*)\] \[(?<level>[^\]]*)\] (?<url>[^ ]*)(?<detail>.*)$/ </parse></source><match nuclei> @type kafka2 brokers ip:port use_event_time false <format> @type json </format> topic_key nuclei default_topic nuclei</match>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
调试总结:
- match是一对一的关系, 也就是说一个source只能对应一个match, 多个的话不生效?
- tail 方式kafka接收消息不是实时的, 可能有一点的延迟
- 日志路径的权限也很重要, 需要保证fluentd可以读取。
- 不是所有消息都会打日志的, 主要还是看数据的流向是哪里。
对于各种格式的匹配, 建议使用正则的方式。
正则的调试可以在下面网址进行:
https://rubular.com/r/xfQHocREGj
总结
在实践中重点关注了tail 方式收集日志,fluentd 还支持其他许多种输入的方式,