ELK收集Docker项目的日志

现在主流的项目部署都是采用 docker 部署了,一般项目使用 STDOUT 输出的日志都被 docker 来收集和保存。我们需要使用著名的 ELK (opens new window) 来分析日志,所以如何部署 ELK 并且把 docker 的日志转发给 ELK 呢? 这就是本篇文章我们需要解决的问题。

# 搭建 ELK

既然我们使用 docker 进行部署,那我们当然也要使用 docker 部署 ELK。docker-elk (opens new window) 是一个配置好的项目,我们可以基于这个项目迅速搭建起一个 ELK 项目。说实话, ELK 项目非常消耗内存,所以至少保证机器有 4GB 内存,否则可能会宕机。搭建好 ELK 之后,记得按照教程重新设置密码。

$ docker-compose exec -T elasticsearch bin/elasticsearch-setup-passwords auto --batch
1

初始化密码之后,并修改 kibanalogstash 的配置文件更新密码。最后再重启这两个服务:

$ docker-compose restart kibana logstash
1

# 使用 GELF 收集日志

GELF (opens new window) 是一个经典的日志格式并且 docker 原生支持这个格式,首先我们需要配置 logstash 采取这个格式来收集日志。

修改 logstash/pipeline/logstash.conf 文件的 input 部分:

input {
	beats {
		port => 5044
	}

	gelf {
		port => 5000
	}
}
1
2
3
4
5
6
7
8
9

这样收集 gelf 的端口就是 5000 默认使用 UDP 格式。修改配置之后别忘了重启 logstash

$ docker-compose restart logstash
1

接下来实际项目要把日志转发到 ELK 上,如果我们使用 docker-compose.yml 需要在当前的 service 上添加 logging 相关的配置:

logging:
  driver: gelf
  options:
    gelf-address: 'udp://0.0.0.0:5000'
1
2
3
4

如果你的 ELK 和 实际项目并不是在同一台主机上,记得修改 0.0.0.0 成相应的主机名或 IP 地址。这样配置之后就可以在 kibana 上查看收集到的日志了。 不过要记得配置 Index patterns 然后在 Discover 界面上就能看到日志记录了。

# 总结

ELK 收集 docker 日志并不是很复杂,但是摸索的时候很难调试,例如 ELK 配置了 gelf 方法收集日志,但却找不到好的方法来测试这个接口是否正常。 我只是通过 nmap 命令来检测 5000 端口是否开放,并不知道是否正常运行。

扫描当前主机的 UDP 端口:

nmap -sU 0.0.0.0
1

启动项目的 docker 的时候还出现了警告信息 warning: no logs are available with the 'gelf' log driver 为了这个问题我查了半天,但发现 这个信息即使出现了也可以正常收集。浪费了不少时间。最终的解决方案总是很简单,但查找的过程中难免绕弯路。

# 参考

https://ibm-cloud-architecture.github.io/b2m-nodejs/logging/ (opens new window)

Using Free Let’s Encrypt SSL/TLS Certificates with NGINX (opens new window)