-
日志处理机制
-
我们先来了解一下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
-
-
转载于:https://my.oschina.net/zhangxufeng/blog/3077564