部署Graylog日志系统
Graylog 是与 ELK 可以相提并论的一款几种式日志管理方案,支持数据收集、检索、可视化Dashboard。
将实践用Graylog来管理Docker日志
Graylog 架构
Graylog 架构如下图所示:
Graylog 负责接收来自各种设备和应用的日志,并未用户提供Web访问接口。
Elasticsearch 用于索引和保存 Graylog接收到的日志
MongoDB 负责保存 Graylog自身的配置信息
与ELK一样,Graylog的部署方案很灵活,快速搭建一个 all-in-one 的环境对于学习很有好处。部署一个高可用的伸缩性集群对于生产环境也是必要的。
部署 Graylog
Graylog 及其相关组件都将以容器的方式部署
[root@localhost ~]# docker run --name graylog-mongo -d mongo:3
部署Elasticsearch
[root@localhost ~]# docker run --name graylog-elasticsearch -d elasticsearch:2 elasticsearch -Des.cluster.name="graylog"
部署Graylog
注意:-e GRAYLOG_WEB_ENDPOINT_URI="http://10.12.31.211:9000/api"中的IP是host外部ip
docker run --link graylog-mongo:mongo \
--link graylog-elasticsearch:elasticsearch \
-p 9000:9000 \
-p 12201:12201/udp \
-e GRAYLOG_WEB_ENDPOINT_URI="http://10.12.31.211:9000/api" \
-e GRAYLOG_PASSWORD_SECRET=somepasswordpepper \
-e GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 \
-d graylog2/server
--link graylog-elasticsearch:elasticsearch
让Graylog容器能够用主机名 mongo和Elasticsearch 访问 MongoDB 和 Elasticsearch的服务
-p 9000:9000
映射Graylog的Web服务器端口9000
-p 12201:12201/udp
映射Graylog接收日志数据的UDP 12201 端口
-e GRAYLOG_WEB_ENDPOINT_URI="http://10.12.31.211:9000/api"
指定Graylog的Web访问URI,请注意这里需要使用docker host 的外部IP
-e GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 \
指定Graylog管理员密码的哈希值,这里用的密码是admin,可以使用命令生产自己的密码哈希“echo -n yourpassword | shasum -a 256”
容器启动后,在 Web 浏览器中访问 http://[Docker Host IP]:9000
用户名/密码 = admin/admin
登录后显示 Getting Started
页面。
配置 Graylog
目前 Graylog 还没法接收任何日志,我们需要配置一个 Input
,点击顶部菜单 System -> Inputs
。
Graylog支持多种 Input 类型,与Graylog对接的 Docker logging driver 是 gelf,因此这里我们需要运行一个 GRLF UDP 类型的Input
在弹出的对话框中操作:1、node选择Graylog容器;2、Title命名为 docker GELF input ,然后点击save
配置完成后如下图所示
Graylog管理日志
首先运行测试容器,设置logging driver为gelf,并设置接收日志的地址,还有添加tag以区分不同容器的日志
docker run -d \
--log-driver=gelf \
--log-opt gelf-address=udp://localhost:12201 \
--log-opt tag="log-test-container-A" \
busybox sh -c 'while true; do echo "This is a log message from container A"; sleep 10; done;'
docker run -d \
--log-driver=gelf \
--log-opt gelf-address=udp://localhost:12201 \
--log-opt tag="log-test-container-B" \
busybox sh -c 'while true; do echo "This is a log message from container B"; sleep 10; done;'
--log-driver=gelf
告诉 Docker 使用 GELF 的 logging driver。
--log-opt gelf-address=localhost:12201
将容器日志发送到 Graylog 的日志接收端口。
--log-opt tag="log-test-container-A"
和 --log-opt tag="log-test-container-B"
在日志中添加一个可选的 tag,用于区分不同的容器
容器启动后,点击Graylog顶部菜单的 Search,就能够查询到容器的日志了
与 Kibana 一样, Graylog也提供了强大的查询功能,比如输入关键字 container B 就能搜到匹配的日志条目
与前面ELK一样,这里我们只是简单的将日志导入到Graylog。实际上Graylog也可以对日志进行归类汇总、分析聚合、创建Dashboard等。
上面实验日志中频繁报错,看老师博客中回复是Elasticsearch没起来,实际上是起来的,访问9200也是有返回值的,估计是版本更新导致,暂且条跳过,上图是老师的实验截图
2019-05-13 15:27:15,299 WARN : org.graylog2.migrations.V20161130141500_DefaultStreamRecalcIndexRanges - Interrupted or timed out waiting for Elasticsearch cluster, checking again.
2019-05-13 15:27:44,882 ERROR: org.graylog2.indexer.cluster.Cluster - Couldn't read cluster health for indices [graylog_*] (Could not connect to http://127.0.0.1:9200)
2019-05-13 15:27:44,882 INFO : org.graylog2.periodical.IndexerClusterCheckerThread - Indexer not fully initialized yet. Skipping periodic cluster check.
Docker 日志管理小结
本章介绍了Docker 日志管理的方案,我们由docker logs 引出了 Docker logging driver,进而学习了ELK日志处理 stack。通过fluentd logging driver,我们很容易的将fluentd接入到日志管理方案中。最后我们还实践了与 ELK同等量级的Graylog。
与容器监控一样,容器日志管理也是一个百花齐放,告诉迭代的技术领域。没有最好的,只有最合适的。
不同企业有不同的部署规模,有自己的管理流程,有个字的业务目标。运维团队有不同的技术背景、人员结构和工作方式。