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

 容器技術在發展到今天已是至關的成熟,但容器不一樣於虛擬機,咱們在使用容器的同時也有不少相關的技術問題須要解決,好比:容器性能監控,數據持久化,日誌監控與分析等。咱們不能像平時使用虛擬機同樣來管理容器,本文我將給你們帶來fluentd+elasticsearch+kilbana容器日誌收集方案。nginx

 咱們將經過容器的fluentd日誌驅動將系統內產生的日誌發送給fluentd服務端,再過來fluentd服務端處理全部容器發送過來的日誌,再轉發到elasticsearch,最後經過kilbana來展現和分析咱們的日誌。咱們將經過如下拓撲來完成咱們的日誌收集。docker

  1. 部署elasticsearch+kilbana,此兩個組件不是本文重點介紹對象,網絡上也要不少關於這兩個組件的部署方法,由於篇幅緣由這裏就不在重複,之後可能會加更新上ELK的部署博文。另外關於Docker的安裝部署也是基本的,相信各位已經在研究容器日誌收集不會連Docker都不會部署吧,完成第一步請繼續往下看json

  2. 部署fluentd與配置tomcat

    1. 安裝主程序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

    2. 安裝elasticsearch插件ide

      由於咱們須要將日誌發送到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. <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. 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.     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. <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配置文件的進階也將在後面的博文中介紹

相關文章
相關標籤/搜索