高效的监控和日志管理对保持生产系统只需稳定的运行以及排查问题至关重要。
在微服务架构中,由于容器的数量众多以及快速变化的特性,使得记录日志和监控变的重要起来。考虑到容器短暂和不固定的生命周期,我们需要debug问题时有些容器可能已经不在了。因此,一套集中式的日志管理系统是生产环境中不可缺少的组成部分。
本章我们将学习监控容器的各种可用技术和方案,首先会介绍 Docker 自带的 logs 子命令
一、Dokcer logs
默认配置下的docker日志功能。
对于一个运行的容器,Docker 会将日志发送到容器的标准输出设备(STDOUT)和标准错误设备(STDERR),STDOUT和STDERR实际上就是容器的控制台终端。
比如我们运行一个httpd容器,查看日志有三种方式:
1、在当前终端运行容器,不放到后台运行,日志直接打印在屏幕上
2、容器-d
参数以后台运行,然后使用 docker attach 进入容器查看,但是退出不方便,容器kill掉容器(ctrl+p+q)
3、容易放到后台运行, docker logs 查看
docker logs
打印出自容器启动以来完整的日志,并且 -f
参数继续打印出新产生的日志,效果上与 Linux 命令 tail -f
一样。
二、Docker 支持多种日志方案
将容器日志发送到 STDOUT 和 STDERR 是Docker 的默认日志行为。实际上,Docker提供了多种日志机制帮助用户从运行的容器中提取日志信息。这些机制被称作logging driver 。
Docker 的默认 logging driver 是 json-file
[root@localhost ~]# docker info | grep 'Logging Driver'
Logging Driver: json-file
[root@localhost ~]#
默认的 logging driver。
json-file 会将容器的日志保存在json文件中,Docker 负责格式化其内容并输出到 STDOUT 和 STDERR
我们可以在 Host 的容器目录中找到这个文件,日志的位置在
docker inspect web03 | jq .[].HostConfig.LogConfig
docker inspect web03 | jq .[].LogPath
比如我们看之前httpd容器的json格式的日志文件
除了 json-file ,Docker 还支持多种 logging driver 。完成的列表可以访问docker官方网站查 询 https://docs.docker.com/config/containers/logging/configure/#supported-logging-drivers
none 是disable 容器日志功能
syslogs 和 journald 是linux上两种日志管理服务
awslogs 、 splunk 和 gcplogs 是第三方日志托管服务
gelf 和 fluentd 是两种开源的日志管理方案
容器在启动时可以通过 --log-driver 指定使用的logging driver 。如果要设置Docker 默认的 logging driver ,需要修改 Docker daemon 的启动脚本,指定 --log-driver 参数,比如下面,每种 logging driver 都有自己的 --log-opt ,用的时候去官网查询即可
ExecStart=/usr/bin/dockerd -H fd:// --log-driver=syslog --log-opt ......