概述
之前一篇文章介绍了如何搭建ELK日志平台,这一篇文章将介绍如何收集Docker的容器日志。
日志
假定我们需要在Docker中运行一个Java微服务应用,必然会产生日志,但是这个日志就有讲究了。
通常情况下,不出意外,Java程序员会使用Slf4j以及Logback来收集日志并在标准输出流里输出日志内容,还会保存成文件(通常情况下,看配置)。
通常后者就是我们经常看到且熟悉的日志文件。
而前者则是悄悄地输出到Docker的容器日志中,通常不做配置的话也会保存在日志文件中。
收集日志
接下来看看,如何收集这些日志,并传送到Logstash呢。
FileBeat
FileBeat是Elastic开发的轻量级日志传送插件,可以将日志传送至各种各样的目标,比如直接传送至Elasticsearch,或者传给Logstash。
FileBeat的安装和配置也是非常简单的,参照官网教程可以轻松搞定。
利用FileBeat收集日志有很多方式:
在宿主机上直接运行FileBeat收集Docker容器日志
![dca6598294c579152bdf97ffb89ae765.png](https://i-blog.csdnimg.cn/blog_migrate/c9f5b102702d6604b7abae38b14964c3.jpeg)
在宿主机上直接运行FileBeat收集Docker容器日志
![391492727d9bd742a77ee577946f5fca.png](https://i-blog.csdnimg.cn/blog_migrate/b663ee24f899ea3be63e5065d430ecd7.jpeg)
容器挂在日志目录并写入Java日志,宿主机运行FileBeat收集Java日志
上面两种还可以把FileBeat当作容器运行,毕竟Docker还是很方便的
![0e79599f8680217eceb0dcaa9819d555.png](https://i-blog.csdnimg.cn/blog_migrate/c05a91f7158c916fc151ee9d10713c0f.jpeg)
把FileBeat当作容器运行
如果是K8S,还可以一个Pod内配一个Java容器和FileBeat容器,共用存储
Docker LoggingDriver SysLog
这是最简单的方式,直接通过SysLog,将容器日志输出到Logstash,非常方便。
![5e66c18b96225a91a22e32f1a7055ee4.png](https://i-blog.csdnimg.cn/blog_migrate/ded7aaf6b3a05d45f0b137618491e735.jpeg)
直接通过SysLog,将容器日志输出到Logstash
通过Docker命令启动容器时指定下面两个参数就可以了
--log-driver syslog--log-opt syslog-address=tcp://logstash-host:port
例如
docker run -d -p 6379:6379 --name redis --log-driver syslog --log-opt syslog-address=tcp://localhost:9601 redis
如果是通过Docker-Compose或者Swarm启动容器,那么在compose文件中添加相应的设置,此外还可以指定Tag来帮助输出容器信息等等。
redis-service: image: redis ports: - 6379:6379 networks: - redis-network privileged: true logging: driver: syslog options: syslog-address: "tcp://localhost:9601" tag: "{{.Name}}/{{.ID}}" deploy: replicas: 2 update_config: parallelism: 1 delay: 10s restart_policy: condition: on-failure
使用SysLog这种方式有利也有弊端,如果docker命令行启动容器时logstash不可用就会报错,而且docker logs命令无法查看容器日志。
最后
欢迎点赞,收藏,转发,关注以及访问我的个人博客站点www.soaringroad.com