浅谈Docker中的日志管理

262 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 23天,点击查看活动详情

日常开发过程中日志一直扮演着一个特殊的角色,项目正常运转的时候通常都没人在意日志,但一旦出现问题就得有请“祖师爷”日志登场了。容器环境也不例外,高效的监控和日志管理对于项目生命周期内的持续稳定运行和问题排查起着至关重要的作用。在微服务架构、容器化技术盛行的今日,一套集中式的日志管理系统已经成为生产环境中不可或缺的一部分了。

Docker logs

Docker logs是Docker容器默认的日志功能,已经运行的容器,Docker会将其日志发送到容器的控制台终端。例如:我们运行一个httpd的容器,可以清楚的看到容器的运行日志打印。

docker run -p 80:80 httpd

image.png

我们这里是没有带-d参数的运行方式,表示以前台方式,日志可以直接在终端窗口上看到。那如果容器运行时带-d参数了我们看不到日志的输出的情况下,该如何查看容器的日志呢?这里有两种方法:

用 docker attach命令查看

可以使用如下命令查看一个容器的日志

docker attach 容器id

但attach方式在实际项目中可能不太实用,因为:

  • 只能看到attach之后的日志,无法查看之前的
  • 退出attach命令的过程有点繁琐,需要先按CTRL+p再按CTRL+q

用 docker logs命令查看

Docker推荐我们使用docker logs的方式来查看,docker logs会把容器启动的所有日志都打印出来,且追加-f参数可以继续打印出新产生的日志。

docker logs -f 容器id

docker logging driver

Docker除了提供将日志发送到终端窗口的能力外,还提供了多种日志机制帮助我们从容器中提取我们想要的日志数据,这一机制称为logging driver。如果我们在容器启动时没有指定,Docker会默认使用logging driver将我们的容器日志保存为json格式的json-file中。我们可以在host的容器目录下找到对应容器的json格式的日志文件,路径为/var/lib/docker/containers/容器id/容器id-json.log

ELK

除了原本的日志方案我们还可以选择开源的日志管理方案ELK(Elasticsearch、Logstash、Kibana)。

  • Elasticsearch:一个接近实时日志查询的全文检索引擎,能够处理和搜索巨量日志数据。
  • Logstash:是一款能够处理各种应用日志且支持对原始日志进行分析和过滤后将结果转发给其他组件进行索引和存储的组件。
  • Kibana:一个提供专业web图形界面程序,主要用于将elasticsearch中的数据进行可视化结果展示,提供用户创建Dashboard来监控系统日志的能力。

Docker部署环境下典型的ELK日志处理流程如下: elk-pipeline-in-docker-environment.png

Logstash复制从容器中提取日志转发给Elasticsearch进行索引和保存,Kibana对Elasticsearch中的数据进行分析和可视化操作。