1. 程式人生 > >docker日誌監控

docker日誌監控

  • 日誌處理機制

    • 我們先來了解一下docker日誌處理的機制,當啟動一個容器的時候,它其實是docker daemon的一個子程序,docker daemon可以拿到你容器裡面程序的標準輸出,拿到標準輸出後,它會通過自身的一個LogDriver模組來處理,LogDriver支援的方式很多,可以寫到本地的檔案(預設方式),可以傳送到syslog等。

    • docker會預設手機應用程式的標準輸出儲存到一個json.log的檔案中,檔案的格式類似下面這種:

      {"log": "root@c835298de6dd:/# ls\r\n", "stream": "stdout", "time": "xxoo.155863426Z"}
      {"log":"bin boot dev\u0009etc home lib\u0009lib64 media mnt opt\u0009proc root run sbin selinux\u0009srv sys tmp usr var\r\n"}
      

      以一行一個作為一條json資料儲存。docker的這種日誌儲存方式是可以配置的,具體引數可以在執行run啟動容器的時候通過log-driver進行配置,具體配置可以參考log-driver。

    • docker預設使用了json-file driver作為log driver,而gelf則是我們需要使用的log driver。當容器多了,或者是採用類似swarm叢集部署docker的時候,各種日誌分散儲存在各個json.log檔案中,當查詢問題或者進行相關統計的時候,分散的日誌對我們來說非常不友好。我們需要一個能夠集中管理docker日誌的工具,這就是graylog。

  • Graylog

    • docker原生支援graylog協議,直接將日誌傳送到graylog(通過gelf協議);
    • graylog官方提供了將本身部署在docker的支援。
  • graylog官方提供了dockerfile供我們快速的在docker上部署日誌系統,在這個docker hub的地址中,也提供了docker-compose.yml來快速部署整個graylog棧,包含了MongoDB、elasticsearch,而不需要分別單獨進行部署。

    https://hub.docker.com/r/graylog/graylog
    
  • graylog部署

    • 建立一個目錄用來部署graylog,本文假設目錄為/root/graylog,以下所有操作都是在/root/graylog中進行的。

    • 初始化目錄和配置檔案

      # 建立資料目錄
      mkdir -p ./graylog/data
      # 建立配置檔案目錄
      mkdir -p ./graylog/config
      cd ./graylog/config
      # 直接下載官方推薦的配置檔案
      wget https://raw.githubusercontent.com/Graylog2/graylog-docker/2.5/config/graylog.conf
      # 日誌配置檔案
      wget https://raw.githubusercontent.com/Graylog2/graylog-docker/2.5/config/log4j2.xml
      
    • 修改下載完的graylog.conf中的root_timezone為GMT+0800中國時區

      root_timezone=Etc/GMT-8
      
    • 新建docker-compose.yml來供docker-compose快速啟動完成服務。需要注意的是,由於docker-compose內容較多,我們以附件的形式存放在了當前同級目錄;

    • 啟動整個服務

      docker-compose up
      
    • 如果沒有問題的話,會看到graylog webserver started的終端輸出訊息。訪問http://{server}:9000會看到graylog的web介面,使用使用者名稱admin,密碼admin來登入後臺,至此部署完成。

  • 完整的docker-compose檔案

    version: '2'
    services:
      mongodb:
        image: mongo:3
        volumes:
          - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime
          - mongo_data:/data/db
      elasticsearch:
        image: elasticsearch:6.6.2
        volumes:
          - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime
          - es_data:/usr/share/elasticsearch/data
    # 這裡需要在本地新增一個jvm.options檔案,並且指定垃圾回收器為G1GC,否則無法啟動成功
          - /Users/zhangxufeng/xufeng.zhang/docker/conf-compose/graylog/graylog/jvm.options:/usr/share/elasticsearch/config/jvm.options
        environment:
          - http.host=0.0.0.0
          - transport.host=localhost
          - network.host=0.0.0.0
          - xpack.security.enabled=false
          - xpack.watcher.enabled=false
          - xpack.monitoring.enabled=false
          - xpack.security.audit.enabled=false
          - xpack.ml.enabled=false
          - xpack.graph.enabled=false
          - ES_JAVA_OPTS=-Xms512m -Xmx512m -XX:+UseG1GC
        ulimits:
          memlock:
            soft: -1
            hard: -1
        mem_limit: 512M
      graylog:
        image: graylog/graylog:2.5
        volumes:
          - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime
          - graylog_journal:/usr/share/graylog/data/journal
          - ./graylog/config:/usr/share/graylog/data/config
        environment:
          - GRAYLOG_PASSWORD_SECRET=admin_zxfwy1314_
          - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
          - GRAYLOG_WEB_ENDPOINT_URI=http://127.0.0.1:9000/api
        links:
          - mongodb:mongo
          - elasticsearch
        depends_on:
          - mongodb
          - elasticsearch
        ports:
          - 9000:9000
          - 514:514
          - 514:514/udp
          - 12201:12201
          - 12201:12201/udp
    volumes:
      mongo_data:
        driver: local
      es_data:
        driver: local
      graylog_journal:
        driver: local
    
  • Graylog系統配置

    • input配置

      • graylog的日誌收集通過定義input物件來完成,在graylogweb管理介面中按照如下方式進入input物件配置,選擇GELF UDP協議來新建一個輸入器:

      • 填好相關屬性,新建,然後儲存,就可以開始收集日誌了:

    • docker配置

      • 如果docker通過命令列啟動,可以在run命令中加上如下引數:

        docker run --log-driver=gelf --log-opt gelf-address=udp://{graylog伺服器地址}:12201 --log-opt tag=<當前容器服務標籤,用來供graylog查詢的時候進行分類> <IMAGE> <執行命令>
        

        示例:

        docker run -d --log-driver=gelf --log-opt gelf-address=udp://localhost:12201 --log-opt tag="{{.ImageName}}/{{.Name}}/{{.ID}}" busybox sh -c 'while true; do echo "Hello, this is A"; sleep 10; done;'
        
      • 如果通過docker-compose命令,則可以在docker-compose.yml中加入相關配置,一下用NGINX容器舉例:

        version: '2'
        services:
          nginx:
            image: nginx:latest
            ports:
              - "80:80"
            logging:
              driver: "gelf"
              options:
                gelf-address: "udp://localhost:12201"
                tag: front-nginx