在EFK系统搭建中,我们用fluent替换了logstash,是因为fluent的数据流处理清晰,同时也有着丰富的插件系统。ruby简洁的语法和便利的gems管理体系放大了这个优势。

RubyGems(简称 gems)是一个用于对 Ruby组件进行打包的 Ruby 打包系统。 它提供一个分发 Ruby 程序和库的标准格式,还提供一个管理程序包安装的工具。RubyGems的功能类似于Linux下的apt-get。使用它可以方便的从远程服务器下载并安装Rails。
fluent提供了单独的gems管理,一般安装在 /usr/sbin/td-agent-gem。常用的操作:
# 版本号
/usr/sbin/td-agent-gem -v
# 安装指定gem包,程序先从本机查找gem包并安装。
#如果本地没有,则从远程gem安装。
/usr/sbin/td-agent-gem install [gemname]
# 更新指定的gem包
/usr/sbin/td-agent-gem update [gemname]
# 注意:gem update [gemname]不会升级旧版本的包,下述命令可以
/usr/sbin/td-agent-gem install [gemname] --version = [ver]
# 删除某指定版本gem
/usr/sbin/td-agent-gem uninstall [gemname] --version=[ver]
# 查看本机已安装的所有gem包
/usr/sbin/td-agent-gem list
# 列出远程RubyGems.org 上有此关键字的gem包(可用正则表达式)
/usr/sbin/td-agent-gem list -r keyword
# 列出远程RubyGems.org 上所有Gmes清单
/usr/sbin/td-agent-gem list -r
近期有个需求,从日志的某个字段中拆解出需要的KV单独输出,在浏览了所有fluentd的插件,没有找到可用的,那就自己动手写一个。fluentd插件查询地址:https://www.fluentd.org/plugins/all
插件编写
首先需要明确,fluentd的filter数据是顺序流向下一个的。项目结构:

其中比较重要的是:
1. filter_parse_request_body.rb (fluentd的filter插件,用于拦截数据,中途修改数据)
2. out_parse_request_body.rb (fluentd的out插件,用于最后格式化输出数据)
3. parse_request_body_extractor.rb (最终执行拆解数据的类)
4. fluent-plugin-parse_request_body.gemspec (项目的配置文件,包括名称、版本号等)
感兴趣的同学,可以参见github:https://github.com/yifriday/fluent-plugin-parse_request_body.git。
插件制作
在结束编码工作之后,使用gem制作上传插件。ruby所写的插件,都可以上传到这个网站https://rubygems.org/ 。下面是在命令行中的相关操作:
➜ fluent-plugin-parse_request_body git:(master) gem build fluent-plugin-parse_request_body.gemspec Successfully built RubyGem Name: fluent-plugin-parse_request_body Version: 0.0.18 File: fluent-plugin-parse_request_body-0.0.18.gem ➜ fluent-plugin-parse_request_body git:(master) gem push fluent-plugin-parse_request_body-0.0.18.gem Pushing gem to https://rubygems.org...Successfully registered gem: fluent-plugin-parse_request_body (0.0.18)
在成功上传插件后。我们就可以使用gem工具,在我们的服务器中安装了。
插件安装和配置
安装直接执行下面语句即可:
/usr/sbin/td-agent-gem install fluent-plugin-parse_request_body
在td-agent.conf中的配置如下:
# 这里要注意filter的顺序 <filter nginx.**> @type parse_request_body key request_body #discard_key true add_field_prefix body. only lat,lng array_value lat,lng array_value_key locatonGPS replace_key location </filter>
零基础起步,很快就可以满足目前的需求了。不过后续还是需要优化一点:组合数据,使用<record>标签动态配置,像geo中配置location一样,而不是现在死配置这种比较low的做法。
其他关于日志系统的搭建使用可以参照:EFK系统搭建,使用kibana分析日志,数据解耦,监控和告警,ES数据运维自动化,用户热力图。




