fluentd

Fluentd 是另一个 Ruby 语言编写的日志收集系统。和 Logstash 不同的是,Fluentd 是基于 MRI 实现的,并不是利用多线程,而是利用事件驱动。

Fluentd 的开发和使用者,大多集中在日本。

配置示例

Fluentd 受 Scribe 影响颇深,包括节点间传输采用磁盘 buffer 来保证数据不丢失等的设计,也包括配置语法。下面是一段配置示例:

  1. <source>
  2. type tail
  3. read_from_head true
  4. path /var/lib/docker/containers/*/*-json.log
  5. pos_file /var/log/fluentd-docker.pos
  6. time_format %Y-%m-%dT%H:%M:%S
  7. tag docker.*
  8. format json
  9. </source>
  10. # Using filter to add container IDs to each event
  11. <filter docker.var.lib.docker.containers.*.*.log>
  12. type record_transformer
  13. <record>
  14. container_id ${tag_parts[5]}
  15. </record>
  16. </filter>
  17. <match docker.var.lib.docker.containers.*.*.log>
  18. type copy
  19. <store>
  20. # for debug (see /var/log/td-agent.log)
  21. type stdout
  22. </store>
  23. <store>
  24. type elasticsearch
  25. logstash_format true
  26. host "#{ENV['ES_PORT_9200_TCP_ADDR']}" # dynamically configured to use Docker's link feature
  27. port 9200
  28. flush_interval 5s
  29. </store>
  30. </match>

注意,虽然示例中演示的是 tail 方式。Fluentd 对应用日志,并不推荐如此读取。FLuentd 为各种编程语言提供了客户端库,应用可以直接加载日志库发送日志。下面是一个 PHP 应用的示例:

  1. <?php
  2. require_once __DIR__.'/src/Fluent/Autoloader.php';
  3. use Fluent\Logger\FluentLogger;
  4. Fluent\Autoloader::register();
  5. $logger = new FluentLogger("unix:///var/run/td-agent/td-agent.sock");
  6. $logger->post("fluentd.test.follow", array("from"=>"userA", "to"=>"userB"));

Fluentd 使用如下配置接收即可:

  1. <source>
  2. type unix
  3. path /var/run/td-agent/td-agent.sock
  4. </source>
  5. <match fluentd.test.**>
  6. type forward
  7. send_timeout 60s
  8. recover_wait 10s
  9. heartbeat_interval 1s
  10. phi_threshold 16
  11. hard_timeout 60s
  12. <server>
  13. name myserver1
  14. host 192.168.1.3
  15. port 24224
  16. weight 60
  17. </server>
  18. <server>
  19. name myserver2
  20. host 192.168.1.4
  21. port 24224
  22. weight 60
  23. </server>
  24. <secondary>
  25. type file
  26. path /var/log/fluent/forward-failed
  27. </secondary>
  28. </match>

fluentd 插件

作为用动态语言编写的软件,fluentd 也拥有大量插件。每个插件都以 RubyGem 形式独立存在。事实上,logstash 在这方面就是学习 fluentd 的。安装方式如下:

  1. /usr/sbin/td-agent-gem install fluent-plugin-elasticsearch fluent-plugin-grok_parser

fluentd 插件列表,见:http://www.fluentd.org/plugins