當一個容器啓動的時候,它實際上是docker deamon的一個子進程,docker daemon能夠拿到容器裏面進程的標準輸出,而後經過自身的LogDriver模塊來處理,LogDriver支持的方式不少,默認寫到本地文件,也能夠發送到syslog等。 html
Docker會默認收集應用程序的標準輸出到一個json.log文件中,以一行一條JSON存儲數據,文件的格式以下:vue
{"log":"root@74205cdc7b53dd:/#ls\r\n","stream":"stdout","time":"xxx.155834526Z"} {"log":"root@74205cdc7b53dd:/#ls\r\n","stream":"stdout","time":"xxx.255834528Z"}
Docker的這種日誌存儲方式能夠在容器啓動時經過指定log-driver進行配置,支持的log driver以下:nginx
Graylog是一個開源的完整的日誌管理工具,功能和ELK相似。Docker原生支持graylog協議,Graylog官方也提供了對Docker的支持,兩者能夠無縫銜接。Graylog官方提供了Dockerfile能夠在Docker上部署日誌系統,同時也提供了docker-compose.yml文件來快速部署整個graylog棧。
詳細內容能夠經過http://docs.graylog.org/en/3.1/pages/installation/docker.html 來查看。git
1.在當前用戶目錄下建立graylog目錄做爲部署的工做目錄:github
$ mkdir graylog $ cd graylog
2.初始化目錄和配置文件web
$ mkdir -p ./graylog/config $ cd ./graylog/config $ wget https://raw.githubusercontent.com/Graylog2/graylog-docker/3.1/config/graylog.conf $ wget https://raw.githubusercontent.com/Graylog2/graylog-docker/3.1/config/log4j2.xml #另外因爲Graylog以ID 1100 定義了用戶和用戶組, #致使Graylog在啓動的時候可能會報config目錄權限不足的錯誤,能夠經過如下命令來解決 chown -R 1100:1100 ./graylog/config
3.修改配置文件, 上一步得到的graylog.conf文件是官方提供的默認配置,用戶能夠根據須要進行配置,好比配置中時區默認爲UTC時區,能夠將其改成中國時區docker
root_timezone = Asia/Shanghai
4.準備docker-compose.yml文件json
version: '3' services: # MongoDB: https://hub.docker.com/_/mongo/ mongo: image: mongo:3 networks: - graylog volumes: - mongo_data:/data/db # Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/6.x/docker.html elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.5.0 volumes: - es_data:/usr/share/elasticsearch/data environment: - http.host=0.0.0.0 - transport.host=localhost - network.host=0.0.0.0 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 deploy: resources: limits: memory: 1g networks: - graylog # Graylog: https://hub.docker.com/r/graylog/graylog/ graylog: image: graylog/graylog:3.1 volumes: - graylog_journal:/usr/share/graylog/data/journal - ./graylog/config:/usr/share/graylog/data/config environment: # CHANGE ME (must be at least 16 characters)! - GRAYLOG_PASSWORD_SECRET=somepasswordpepper # Password: admin - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 - GRAYLOG_HTTP_EXTERNAL_URI=http://192.168.0.103:9000/ networks: - graylog depends_on: - mongo - elasticsearch ports: # Graylog web interface and REST API - 9000:9000 # Syslog TCP - 1514:1514 # Syslog UDP - 1514:1514/udp # GELF TCP - 12201:12201 # GELF UDP - 12201:12201/udp networks: graylog: driver: bridge # Volumes for persisting data, see https://docs.docker.com/engine/admin/volumes/volumes/ volumes: mongo_data: driver: local es_data: driver: local graylog_journal: driver: local
5.運行 「docker-compose up」啓動服務, 服務正常啓動後就能夠經過http://ip:9000 進行訪問graylog的Web界面,默認用戶admin/admin。服務器
Graylog的日誌收集經過定義input來完成,在Graylog的Web管理頁面的System tab下能夠選擇定義input來對日誌進行收集markdown
進入input頁面後選擇input的類型,好比定義GELF UDP的input:
選擇完成後點擊 「Lanch new input」,就會進入詳細的input配置,配置完成後保存就能夠了
保存後一切正常的話,input就會進入RUNNING狀態,這時就能夠往這個input裏面發送數據了,點擊「Stop input」,input就會中止,數據的接收也會中止,「Stop input」會變成「Start input」,須要接受數據的時點擊啓動就能夠了。
配置Docker容器發送數據到Graylog時能夠在運行docker run命令啓動容器的時候加上以下參數:
docker run --log-driver=gelf \ --log-opt gelf-address=udp://graylog服務器地址:12201 \ --log-opt tag=<當前容器服務標籤,用來供graylog查詢的時候進行分類> \ <IMAGE> <COMMAND>
具體示例:
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 "Graylog test message"; sleep 10; done;'
若是容器經過docker-compose命令啓動能夠在docker-compose.yml文件中加入如下配置:
logging: driver:"gelf" options: gelf-address:"udp://graylog服務器地址:12201" tag:"容器服務標籤"
具體示例:
version: '2' services: nginx: image: nginx:latest ports: - "80:80" logging: driver: "gelf" options: gelf-address: "udp://localhost:12201" tag: nginx-service
日誌發送配置好以後就能夠在的Search tab下搜索產看日誌信息