容器技术在发展到今天已经是相当的成熟,但容器不同于虚拟机,我们在使用容器的同时也有很多相关的技术问题需要解决,比如:容器性能监控,数据持久化,日志监控与分析等。我们不能像平时使用虚拟机一样来管理容器,本文我将给大家带来fluentd+elasticsearch+kilbana容器日志收集方案。
我们将通过容器的fluentd日志驱动将系统内产生的日志发送给fluentd服务端,再过来fluentd服务端处理所有容器发送过来的日志,再转发到elasticsearch,最后通过kilbana来展示和分析我们的日志。我们将通过以下拓扑来完成我们的日志收集。
如果你按我的操作方法完成的日志收集,你不会天真的以为就这么简单,错!当然没有这么简单。我们只是简单的完成了日志收集与展示。fluentd收集的日志每一条记录都会存放在log字段中,我们还需要对log这个字段进行json格式化处理,方便我们对日志进行分析,操作方法如下:
修改我们的Nginx镜像的日志格式为json格式,关于如何修改大家可以根据自己需求,参考更多网友的方法进行修改,我这里修改模板为:
log_format main '{ "@timestamp": "$time_iso8601", ' '"@fields": { ' '"remote_addr": "$remote_addr", ' '"remote_user": "$remote_user", ' '"body_bytes_sent": "$body_bytes_sent", ' '"request_time": "$request_time", ' '"status": "$status", ' '"request": "$request", ' '"request_method": "$request_method", ' '"http_referrer": "$http_referer", ' '"http_x_forwarded_for": "$http_x_forwarded_for", ' '"http_user_agent": "$http_user_agent" } }';修改我们的fluentd服务端配置文件如下:
<source> @type forward port 24224 bind 0.0.0.0 </source> <filter docker.test.nginx> @type parser format json key_name log </filter> <match docker.test.nginx> @type elasticsearch host 192.168.1.23 port 9200 logstash_format true logstash_prefix docker.test.nginx logstash_dateformat %Y-%m-%d flush_interval 5s type_name docker_container_log include_tag_key true </match>
修改完成后记得td-agent服务
通过以上的步骤我们也基本完成了对Nginx日志的json处理,可以通过我们定义的字段通过ELK进行日志的分析与处理。如果你的应用只有Nginx,那么恭喜你大功告成。但如果你还有其它日志要收集比如Tomcat,那么问题又来了,Tomcat的访问日志我们可以和Nginx一样进行json处理,但catalina日志怎么办,catalina的错误日志我们需要进行多行合并处理,还需要进行字段进行过滤,进行分析,我们有两种方法进行处理,一种是让开发把日志直接写成json格式,另外一种就是由我们来通过fluentd服务端转换,由于对fluentd研究不足,关于对tomcat容器日志收集的方法有机会写在后面的博文中,关于fluentd配置文件的进阶也将在后面的博文中介绍