Docker日誌
當一個容器啓動的時候,它其實是docker deamon的一個子進程,docker daemon可以拿到容器裏面進程的標準輸出,然後通過自身的LogDriver模塊來處理,LogDriver支持的方式很多,默認寫到本地文件,也可以發送到syslog等。
Docker會默認收集應用程序的標準輸出到一個json.log文件中,以一行一條JSON存儲數據,文件的格式如下:
{"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如下:
Graylog日誌管理
Graylog是一個開源的完整的日誌管理工具,功能和ELK類似。Docker原生支持graylog協議,Graylog官方也提供了對Docker的支持,二者可以無縫銜接。Graylog官方提供了Dockerfile可以在Docker上部署日誌系統,同時也提供了docker-compose.yml文件來快速部署整個graylog棧。
詳細內容可以通過 http://docs.graylog.org/en/3.1/pages/installation/docker.html 來查看。
Graylog部署
1.在當前用戶目錄下創建graylog目錄作爲部署的工作目錄:
$ mkdir graylog
$ cd graylog
2.初始化目錄和配置文件
$ 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時區,可以將其改爲中國時區
root_timezone = Asia/Shanghai
4.準備docker-compose.yml文件
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配置日誌收集
Graylog的日誌收集通過定義input來完成,在Graylog的Web管理頁面的System tab下可以選擇定義input來對日誌進行收集
進入input頁面後選擇input的類型,比如定義GELF UDP的input:
選擇完成後點擊 “Lanch new input”,就會進入詳細的input配置,配置完成後保存就可以了
保存後一切正常的話,input就會進入RUNNING狀態,這時就可以往這個input裏面發送數據了,點擊“Stop input”,input就會停止,數據的接收也會停止,“Stop input”會變成“Start input”,需要接受數據的時點擊啓動就可以了。
配置Docker容器發送數據到Graylog
配置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下搜索產看日誌信息
本文分享自微信公衆號 - Coding Diary(gh_7e1f05090980)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。