Nginx容器日志收集方案fluentd+elasticsearch+kilbana

容器技术在发展到今天已经是相当的成熟,但容器不同于虚拟机,我们在使用容器的同时也有很多相关的技术问题需要解决,比如:容器性能监控,数据持久化,日志监控与分析等。我们不能像平时使用虚拟机一样来管理容器,本文我将给大家带来fluentd+elasticsearch+kilbana容器日志收集方案。

 我们将通过容器的fluentd日志驱动将系统内产生的日志发送给fluentd服务端,再过来fluentd服务端处理所有容器发送过来的日志,再转发到elasticsearch,最后通过kilbana来展示和分析我们的日志。我们将通过以下拓扑来完成我们的日志收集。

  1. 部署elasticsearch+kilbana,此两个组件不是本文重点介绍对象,网络上也要很多关于这两个组件的部署方法,因为篇幅原因这里就不在重复,以后可能会加更新上ELK的部署博文。另外关于Docker的安装部署也是基本的,相信各位已经在研究容器日志收集不会连Docker都不会部署吧,完成第一步请继续往下看

  2. 部署fluentd与配置

    1. 安装主程序

      大家请至官网下载自己所需要版本,对号入坐。我测试为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.rpm

    2. 安装elasticsearch插件

      因为我们需要将日志发送到elasticsearch,所以需要安装此插件,默认此插件没有安装,执行以下命令安装:

      /opt/td-agent/embedded/bin/gem install fluent-plugin-elasticsearch

      我们可以查看安装的插件列表:

      /opt/td-agent/embedded/bin/gem list

    3. 编辑配置文件/etc/td-agent/td-agent.conf

      如果存在此配置文件我们清空文件里面所有内容,增加如下内容:

    4. 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      < 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 >
    5. 启动服务

      systemctl start td-agent

      确保已经监听0.0.0.0:24224

  3. 启动Nginx容器

    1. 启动命令:

    2. 1
      2
      3
      4
      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
    3. 启动命令介绍:

      1. --log-driver:指定容器的日志驱动,Docker默认支持很多日志驱动,可以查看官方文档。

      2. --log-opt:指定日志驱动的选项,其中fluentd-address指定fluentd服务端的IP与端口,tag指定日志的标签,fluentd根据标签来对日志进行分类处理,每一条日志发送到fluentd服务端的时候都会打上此标签。

  4. 当我们完成以上几步那么我们的日志收集就完成了一大半了,我们的Nginx访问日志和错误日志都已经通过fluentd驱动传送到fluentd服务端,然后fluentd服务端又将日志处理发送到elasticsearch,最后我们只需要通过kilbana,将日志从elasticsearch取出展示及可。


如果你按我的操作方法完成的日志收集,你不会天真的以为就这么简单,错!当然没有这么简单。我们只是简单的完成了日志收集与展示。fluentd收集的日志每一条记录都会存放在log字段中,我们还需要对log这个字段进行json格式化处理,方便我们对日志进行分析,操作方法如下:

  1. 修改我们的Nginx镜像的日志格式为json格式,关于如何修改大家可以根据自己需求,参考更多网友的方法进行修改,我这里修改模板为:

  2. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
         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" } }' ;
  3. 修改我们的fluentd服务端配置文件如下:

  4. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    < 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配置文件的进阶也将在后面的博文中介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值