Fluentd日志搜集系统初步实践

勿忘初心2018-12-05 13:25

此文已由作者左裕初授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验


What is Fluentd

Fluentd是一个日志搜集系统,可以搜集不同地方的日志并且归集到一起。最近深入地思考了关于日志的事情,觉得还是有必要记录一下。

Fluentd相当于提供了一个统一的日志层,接收不同地方的日志输入,归整到另外的地方,以便日志查询和过滤,报警之类的

Why Fluentd

事实上有很多类似的服务,但是并没有提到Fluentd,相对来说,fluentd比起Kafka和RabbitMQ要高一个层面,毕竟他们只是一个消息队列,不能完全称为日志服务器。

Linux底下现在有rsyslog,这也没有什么问题,fluentd可以把rsyslog的输入当成输入。rsyslog要想输出到elastic-search的话还是要花点功夫的,但是fluentd却很友好。

而且, fluentd是以Json作为日志格式的,无论是mongo还是elastic-search,都可以很好地支持。对于分布式的系统,或者说组件比较多的系统,或者是采用Micro-service的系统,fluentd都可以很方便地支持。

关于安装

td-agent和fluentd其实是一个东西,官网说得很清楚他们的区别了 http://www.fluentd.org/faqs,fluentd是一个社区在维护,所以作为个人使用,我还是推荐用fluentd.

接下来的安装主要用到ruby,我至今没搞明白为什么装个ruby都要翻墙,建议用rvm安装,远离主题,这里就不赘述了。

安装完ruby之后可以用

gem install fluentd --no-ri --no-rdoc

安装fluentd

测试是否安装成功:

fluentd --setup ./fluent

fluentd -c ./fluent.conf -d fluentd.pid  # 启动fluentd,使用fluent.conf的配置并且生成一个Pid文件,后面Fluent-ui会用到

echo '{"json":"message"}' | fluent-cat debug.test

这里强烈推荐安装Fluent-ui来配置和管理Fluentd。

关于使用

fluent.conf是Fluentd的配置文件,所有的输入和输出都是定义在这里的

下民是一份我用来监视haproxy.log的配置,source定义了日志的来源,type tail其实是一个内置的插件,用于监视一个文本文件,类似tail -f的功能。pos文件记录了文件的位置,对于提高性能颇有意义。最后我们给这对日志打上ntProtocol.haproxy的一个标签,表明这是nyProtocol的Haproxy的日志。最复杂的地方是Format,这是一正则表达式,匹配haproxy的每一行日志,但是对于自己打的log,一般都不会这么复杂,相对来说也好解析。

<source>
  @type forward
  @id forward_input
</source>


<source>
  type tail
  format /^(?<syslog_time>.+) (?<source_ip>.+) (?<ps>\w+)\[(?<pid>\d+)\]: (?<c_ip>[\w\.]+):(?<c_port>\d+) \[(?<time>.+)\] (?<f_end>[\w\.-]+) (?<b_end>[\w\.-]+)\/(?<b_server>[\w\.-]+) (?<tq>\d+)\/(?<tw>\d+)\/(?<tc>\d+)\/(?<tr>\d+)\/(?<tt>\d+) (?<status_code>\d+) (?<bytes_read>\d+) (?<captured_request_cookie>.+) (?<captured_response_cookie>.+) (?<termination_state>.+) (?<actconn>\d+)\/(?<feconn>\d+)\/(?<beconn>\d+)\/(?<srv_conn>\d+)\/(?<retries>\d+) (?<srv_queue>\d+)\/(?<backend_queue>\d+) "(?<http_request>.+)"$/
  time_format %d/%B/%Y:%H:%M:%S
  path /var/log/haproxy.log
  pos_file /home/zuo/Runtime/ruby-fluent/haproxy_access.pos
  tag ntProtocol.haproxy
</source>


<match ntProtocol.**>
  @type file
  path /home/zuo/Runtime/ruby-fluent/logs/ntProtocol.log
  compress gz
</match>

match的模块定义了ntProtocol.**这样的标签的日志的输出,简单起见,这里还是输出到文件,这里@type file其实是一个输出插件,自带了rotate等常用功能。

More

Fluentd的文档在我看来是极好的,,关于每个插件也说得很清楚。


免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐

更多网易技术、产品、运营经验分享请点击