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/configcd ./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:3volumes:- mongo_data:/data/db# Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/6.x/docker.htmlelasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:6.5.1volumes:- es_data:/usr/share/elasticsearch/dataenvironment:- 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: -1hard: -1mem_limit: 256M# Graylog: https://hub.docker.com/r/graylog/graylog/graylog:image: graylog/graylog:2.5volumes:- graylog_journal:/usr/share/graylog/data/journal- ./graylog/config:/usr/share/graylog/data/configenvironment:# 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/apilinks:- mongodb:mongo- elasticsearchdepends_on:- mongodb- elasticsearchports:# 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: locales_data:driver: localgraylog_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可以无视这个警告,日志还是会继续发送过去的。
