Fluentd简介

By | 2019年12月3日
目录
[隐藏]

最近公司想要统一管理各个项目的日志,也为以后日志可视化查询做一个铺垫。经过筛选,选择了fluentd来做日志的收集转发工作,预想利用EFK来做日志收集、查询、可视化的方案。

啥?你问我为啥不用Logstash,可参考文章Fluentd vs. Logstash: A Comparison of Log Collectors
,两者差异并不大,Fluentd所占内存较小、社区更活跃。

Fluentd是什么?能解决什么问题?

官网简介: Fluentd是一个用于统一日志层的开源数据收集器。Fluentd允许您统一数据收集和使用,以便更好地使用和理解数据。Fluentd是云端原生计算基金会(CNCF)的成员项目之一,遵循Apache 2 License协议

这我们应用中,Fluentd负责从游戏服务器收集日志信息,将数据流交给后续数据存盘、查询工具。换句话说,Fluentd不负责生产数据、不负责存储数据,只是数据的搬运工。

  • 使用JSON进行统一日志记录:Fluentd尝试尽可能地将数据结构化为JSON:这允许Fluentd 统一处理日志数据的所有方面:收集,过滤,缓冲和跨多个源和目标(统一日志层)输出日志。使用JSON可以更轻松地进行下游数据处理,因为它具有足够的结构,可以在保留灵活模式的同时进行访问。
  • 可插拔架构:Fluentd拥有灵活的插件系统,允许社区扩展其功能。我们的500多个社区贡献插件连接了数十个数据源和数据输出。通过利用插件,您可以立即开始更好地使用日志。
  • 所需的资源较少: Fluentd是用C语言和Ruby组合编写的,只需要很少的系统资源。vanilla实例运行30-40MB内存,可处理13,000个事件/秒/核心。
  • 内置可靠性:Fluentd支持基于内存和文件的缓冲,以防止节点间数据丢失。Fluentd还支持强大的故障转移功能,可以设置为高可用性。

注:fluentd-benchmark 对简单数据2014-02-20 17:20:55 +0900 [info]: plugin:out_flowcounter_simple count:500 indicator:num unit:second测压结果是157148次/s


Fluentd解决数据流流向混乱的问题,通过在两者之间提供统一的日志记录层,从后端系统中分离数据源。

为什么要用Fluentd?

  • 简单易用且灵活
  • 开源
  • 久经考验的可靠性和性能:5,000多家数据驱动型公司依靠Fluentd通过更好地使用和了解他们的日志数据来区分他们的产品和服务。
  • 活跃的社区
  • 与Logstash相比占用内存更少、社区更活跃,两者比较可参考Fluentd vs. Logstash: A Comparison of Log Collectors

人气情况:

  • github fluent/fluentd start 6.8k
  • npm fluent-logger weekly downloads 11,493

Fluentd的用户:

  • Atlassian
  • Microsoft
  • amazon
  • LINE
  • PPTV

fluentd安装

fluentd安装、启动可参考Fluent doc

Fluentd配置

  • source: 数据源配置,可接受log-tail、http、tcp、udp等方式数据,
  • filter: 数据过滤配置,对匹配的tag进行过滤
  • match: 数据输出配置,对匹配的tag进行输出设置
1
2
3
4
5
6
7
8
9
10
11
<source>
  @type tcp
  tag tcp.events # required
  <parse>
    @type regexp
    expression /^(?<field1>\d+):(?<field2>\w+)$/
  </parse>
  port 5170   # optional. 5170 by default
  bind 0.0.0.0 # optional. 0.0.0.0 by default
  delimiter \n # optional. \n (newline) by default
</source>

Example input:

1
$ echo '123456:awesome' | netcat 0.0.0.0 5170

Parsed result like below:

1
{"field1":"123456","field2":"awesome}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
## built-in TCP input
## @see http://docs.fluentd.org/articles/in_forward
<source>
  @type forward
  @id input_forward
  <security>
    self_hostname input.local
    shared_key liang_handsome
  </security>
</source>

<filter example.*.*>
  @type grep
  regexp1 levelStr (INFO|WARN|ERROR)
</filter>

# 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 example.*.*>
  @type file
  path E:\software\fluentd\td-agent\log\output_file
</match>

fluentd更多配置请参考官网:https://docs.fluentd.org/v1.0/articles/config-file

fluent-logger配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import {configure, getLogger, shutdown} from 'log4js'

const fluentAppender = configure({
  appenders: {
    "fluent": {
      "type": "log4js-fluent-appender",
      "tag_prefix": "example.your_keys",
      "options": {
        "levelTag": true,
        "host": "localhost",
        "port": 24224,
        "timeout": 3.0,
        "reconnectInterval": 600000,
        "security": {
          "clientHostname": "client",
          "sharedKey": "liang_handsome"
        }
      }
    }
  },
  categories: {
    default: {
      appenders: ['fluent'],
      level: 'info'
    }
  }
});

如上配置,fluent-logger根据host、port连接fluentd,sharedKey作为连接认证

1
logger.info({log_type: "create-room", uuid: 1112, room_id: 234, config: {cards: 16, chairs: 3}});

fluentd输出为:

2018-10-18T10:50:38+08:00 example.your_keys.INFO {"timestamp":1539831038583.0,"category":"default","levelInt":20000,"levelStr":"INFO","context":{},"data":"log { log_type: 'create-room', uuid: 1112, room_id: 234 }"}

JavaScript fluent_logger缓存测试:

  • 在fluentd关闭的情况下,logger输出20条日志,开启fluentd,fluent-logger会自动连接上fluentd,并将缓存的20条log发送至fluentd
  • 正常连接fluentd,输出5条log。然后关闭fluentd,继续输出15条log,启动fluentd,fluent-logger自动连接上fluentd,并将缓存的15条log发送至fluentd

以上测试表明fluentd-logger在与fluentd丢失连接时,相关log暂先会缓存起来,并在重连时将缓存的log发送至fluentd。这个机制相当优秀,大大增加了安全性,不过要注意缓存是占用内存的,如果长时间连接不上fluentd,有内存耗尽的风险。

日志解决方案实战

可参考文档:基于Elasticsearch+Fluentd+Kibana的日志收集分析系统搭建与应用

未来展望

fluentd收集数据,可输出到hadoop中,利用数据做数据挖掘,可以实现很多有价值的目标。比如:

  • 监测用户行为,针对流失较高的点,优化流失率,提高留存
  • 监测消费行为,针对性营销,增加收入
  • 异常检测,发现数据异常情况,第一时间发现服务器逻辑漏洞
  • 消费数据挖掘,将消费者分类,同类消费者商品推荐
  • 发现即将流失客户,重点给与相关优惠吸引策略
  • 发现核心用户,重点关注

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注