容器技术在发展到今天已是至关的成熟,但容器不一样于虚拟机,咱们在使用容器的同时也有不少相关的技术问题须要解决,好比:容器性能监控,数据持久化,日志监控与分析等。咱们不能像平时使用虚拟机同样来管理容器,本文我将给你们带来fluentd+elasticsearch+kilbana容器日志收集方案。nginx
咱们将经过容器的fluentd日志驱动将系统内产生的日志发送给fluentd服务端,再过来fluentd服务端处理全部容器发送过来的日志,再转发到elasticsearch,最后经过kilbana来展现和分析咱们的日志。咱们将经过如下拓扑来完成咱们的日志收集。docker
部署elasticsearch+kilbana,此两个组件不是本文重点介绍对象,网络上也要不少关于这两个组件的部署方法,由于篇幅缘由这里就不在重复,之后可能会加更新上ELK的部署博文。另外关于Docker的安装部署也是基本的,相信各位已经在研究容器日志收集不会连Docker都不会部署吧,完成第一步请继续往下看json
部署fluentd与配置tomcat
安装主程序bash
你们请至官网下载本身所须要版本,对号入坐。我测试为CentOS7-x86_64,因此我下载的包为:td-agent-2.3.5-1.el7.x86_64.rpm,执行如下命令安装:网络
yum -y install td-agent-2.3.5-1.el7.x86_64.rpmelasticsearch
安装elasticsearch插件ide
由于咱们须要将日志发送到elasticsearch,因此须要安装此插件,默认此插件没有安装,执行如下命令安装:性能
/opt/td-agent/embedded/bin/gem install fluent-plugin-elasticsearch测试
咱们能够查看安装的插件列表:
/opt/td-agent/embedded/bin/gem list
编辑配置文件/etc/td-agent/td-agent.conf
若是存在此配置文件咱们清空文件里面全部内容,增长以下内容:
<source> @type forward port 24224 bind 0.0.0.0 </source> <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>
启动服务
systemctl start td-agent
确保已经监听0.0.0.0:24224
启动Nginx容器
启动命令:
docker run -dit -p 8080:80 --log-driver=fluentd \ --log-opt fluentd-address=192.168.3.232:24224 \ --log-opt tag="docker.test.nginx" \ nginx
启动命令介绍:
--log-driver:指定容器的日志驱动,Docker默认支持不少日志驱动,能够查看官方文档。
--log-opt:指定日志驱动的选项,其中fluentd-address指定fluentd服务端的IP与端口,tag指定日志的标签,fluentd根据标签来对日志进行分类处理,每一条日志发送到fluentd服务端的时候都会打上此标签。
当咱们完成以上几步那么咱们的日志收集就完成了一大半了,咱们的Nginx访问日志和错误日志都已经经过fluentd驱动传送到fluentd服务端,而后fluentd服务端又将日志处理发送到elasticsearch,最后咱们只须要经过kilbana,将日志从elasticsearch取出展现及可。
若是你按个人操做方法完成的日志收集,你不会天真的觉得就这么简单,错!固然没有这么简单。咱们只是简单的完成了日志收集与展现。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配置文件的进阶也将在后面的博文中介绍