高效的监控和日志管理对保持生产系统持续稳定地运行以及排查问题相当重要。在微服务架构中,因为容器的数量众多以及快速变化的特性使得记录日志和监控变得愈来愈重要。考虑到容器短暂和不固定的生命周期,当咱们须要 debug 问题时有些容器可能已经不存在了。所以,一套集中式的日志管理系统是生产环境中不可或缺的组成部分。docker
本章咱们将讨论监控容器的各类可用技术和方案,首先会介绍 Docker 自带的 logs 子命令,而后讨论 Docker 的 logging driver,接下来经过实践学习几个已经普遍应用的日志管理方案:ELK、Fluentd 和 Graylog。架构
咱们首先来看一看默认配置下 Docker 的日志功能。dom
对于一个运行的容器,Docker 会将日志发送到 容器的 标准输出设备(STDOUT)和标准错误设备(STDERR),STDOUT 和 STDERR 实际上就是容器的控制台终端。curl
举个例子,用下面的命令运行 httpd 容器:微服务
docker run -p 80:80 httpd学习
由于咱们在启动日志的时候没有用 -d
参数,httpd 容器之前台方式启动,日志会直接打印在当前的终端窗口。this
若是加上 -d
参数之后台方式运行容器,咱们就看不到输出的日志了。url
root@host1:~# docker run -d -p 81:80 httpd 0aeccbe176442fe521ee1dd19aa9fabb5edf758b64d37412ad3737585847c434 root@host1:~#
这种状况下若是要查看容器的日志,有两种方法:命令行
docker logs
命令查看日志。先来看 attach 的方法。运行 docker attach
命令。debug
attach 到了 httpd 容器,但并无任何输出,这是由于当前没有新的日志信息。
为了产生一条新的日志,能够在 host 的另外一个命令行终端执行 curl localhost
。
这时,attach 的终端就会打印出新的日志。
attach 的方法在实际使用中不太方便,由于:
查看容器日志推荐的方法是用 docker logs
命令。
root@host1:~# docker logs 0aeccbe17644 AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message [Wed Nov 18 09:01:11.542927 2020] [mpm_event:notice] [pid 1:tid 140339416298624] AH00489: Apache/2.4.46 (Unix) configured -- resuming normal operations [Wed Nov 18 09:01:11.543957 2020] [core:notice] [pid 1:tid 140339416298624] AH00094: Command line: 'httpd -D FOREGROUND' root@host1:~#
docker logs
可以打印出自容器启动以来完整的日志,而且 -f
参数能够继续打印出新产生的日志,效果上与 Linux 命令 tail -f
同样。