1. Docker 日志
- 当启动一个容器的时候,它其实是 docker daemon 的一个子进程,docker daemon 可以拿到你容器里面进程的标准输出,拿到标准输出后,它会通过自身的一个 LogDriver 模块来处理,LogDriver 支持的方式很多,可以写到本地的文件(默认方式),可以发送到 syslog 等。
- Docker 会默认收集应用程序的标准输出存储到一个 json.log 文件中。
- Docker 日志存储方式是可配置的,具体参数可以在执行 run 启动容器的时候通过 log-driver 进行配置,具体配置参考 log-driver(https://docs.docker.com/config/containers/logging/configure/#supported-logging-drivers)。
2. Graylog
-
选择 graylog 的原因
Docker 原生支持 graylog 协议,直接将日志发送到 graylog(通过 gelf 协议)。
- graylog 官方提供了将本身部署在 Docker 的支持。
3. Graylog 部署
graylog 官方提供了 Dockerfile 供我们快速的在 Docker 上部署日志系统,在这个 Docker Hub 的地址中,也提供了 docker-compose.yml 来快速部署整个 graylog 栈,包含了 mongodb、ElasticSearch,而不需要分别单独进行部署。
- 创建一个目录用来部署 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
修改下载完的 garylog.conf 中的 root_timezone 为 GMT+0800 中国时区。
root_timezone=Asia/Shanghai
新建 docker-compose.yml 来提供 docker-compose 快速启动完整服务。(内容如下)
version: '2'
services:
# MongoDB: https://hub.docker.com/_/mongo/
mongodb:
image: mongo:3
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:6.5.1
volumes:
- es_data:/usr/share/elasticsearch/data
environment:
- http.host=0.0.0.0
- transport.host=localhost
- network.host=0.0.0.0
# Disable X-Pack security: https://www.elastic.co/guide/en/elasticsearch/reference/6.x/security-settings.html#general-security-settings
- 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=-Xms256m -Xmx256m"
ulimits:
memlock:
soft: -1
hard: -1
mem_limit: 256M
# Graylog: https://hub.docker.com/r/graylog/graylog/
graylog:
image: graylog/graylog:2.5
volumes:
- graylog_journal:/usr/share/graylog/data/journal
- ./graylog/config:/usr/share/graylog/data/config
environment:
# CHANGE ME!
- GRAYLOG_PASSWORD_SECRET=somepasswordpepper
# Password: admin
- GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
# 这个地址需要配置成你要访问的地址,比如你的容器部署在192.168.1.2,你需要配置成http://192.168.1.2:9000/api,否则访问会报错
- GRAYLOG_WEB_ENDPOINT_URI=http://192.168.100.249:9000/api
links:
- mongodb:mongo
- elasticsearch
depends_on:
- mongodb
- elasticsearch
ports:
# Graylog web interface and REST API
# web界面端口
- 9000:9000
# gelf收集日志的端口,如果需要添加graylog收集器,可以新增暴露出来的端口
# Syslog TCP
- 514:514
# Syslog UDP
- 514:514/udp
# GELF TCP
- 12201:12201
# GELF UDP
- 12201:12201/udp
# 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
启动整个服务。
docker-compose up
- 如果没有问题的话,会看到 graylog webserver started 的终端输出消息。
- 访问
http://ip:9000/
,会看到 graylog 界面,账户密码:admin/admin。4. Graylog 系统配置
input 配置
- graylog 的日志收集是通过定义 input 对象来完成的。
- 选择
System
->Inputs
->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 get-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://192.168.100.249:12201" tag: front-nginx
容器启动的时候可能会发生下面提示:
WRANNING: no logs are available with the 'gelf' log driver
可以无视这个警告,日志还是会继续发送过去的。