此文已由作者左裕初授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验
Fluentd是一个日志搜集系统,可以搜集不同地方的日志并且归集到一起。最近深入地思考了关于日志的事情,觉得还是有必要记录一下。
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等常用功能。
Fluentd的文档在我看来是极好的,,关于每个插件也说得很清楚。
免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐
更多网易技术、产品、运营经验分享请点击。