容器

你必须知道的容器日志 Docker logs & logging driver

转载:https://www.cnblogs.com/edisonchou/p/docker_logs_study_summary_part1.html

本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。监控和日志历来都是系统稳定运行和问题排查的关键,在微服务架构中,数量众多的容器以及快速变化的特性使得一套集中式的日志管理系统变成了生产环境中一个不可获取的部分。此次话题我们会集中在日志管理方面,本篇会介绍Docker自带的logs子命令以及其Logging driver。

一、Docker logs子命令


默认情况下,Docker的日志会发送到容器的标准输出设备(STDOUT)和标准错误设备(STDERR),其中STDOUT和STDERR实际上就是容器的控制台终端。

我们可以通过logs子命令来查看具体某个容器的日志输出:

docker logs edc-k8s-demo

这时看到的日志是静态的,截止到目前为止的日志。如果想要持续看到新打印出的日志信息,那么可以加上 -f 参数,如:

docker logs -f edc-k8s-demo

二、Docker logging driver


刚刚我们学习了默认配置下,Docker日志会发送到STDOUT和STDERR。但实际上,Docker还提供了其他的一些机制允许我们从运行的容器中提取日志,这些机制统称为 logging driver。

对Docker而言,其默认的logging driver是json-file,如果在启动时没有特别指定,都会使用这个默认的logging driver。

json-file会将我们在控制台通过docker logs命名看到的日志都保存在一个json文件中,我们可以在服务器Host上的容器目录中找到这个json文件。

容器日志路径:/var/lib/docker/containers/<container-id>/<container-id>-json.log

例如我们可以查看一个exceptionless-api容器的json日志:

一个快速查看某个容器的日志文件路径的方法:

docker inspect exceptionless_api_1

通过inspect命令,可以查到该容器的ID及一系列配置信息,我们重点关注LogPath即可:

查到LogPath后,即可复制其后面的日志路径了,打开这个json文件你就可以看到输出的容器日志了。

除了json-file,Docker还支持以下多种logging dirver,来源:Configure logging drivers

其中,none 代表禁用容器日志,不会输出任何容器日志。

其他几个logging driver解释如下:

  • syslog 与 journald 是Linux上的两种日志管理服务
  • awslog、splunk 与 gcplogs是第三方日志托管服务
  • gelf 与 fluentd 是两种开源的日志管理方案

我们可以在容器启动时通过加上 –log-driver 来指定使用哪个具体的 logging driver,例如:

docker run -d --log-driver=syslog ......

如果想要设置默认的logging driver,那么则需要修改Docker daemon的启动脚本,例如:

{
  "log-driver": "json-file",
  "log-opts": {
    "labels": "production_status",
    "env": "os,customer"
  }
}

每个logging driver都有一些自己特定的log-opt,使用时可以参考具体官方文档。

三、小结


本文介绍了Docker自带的logs子命令以及logging driver,默认的logging driver是json-file,当然Docker还支持多个不同机制的logging dirver,我们可以根据自己的需要在使用时进行指定。下一篇,我们会学习流行的开源日志管理三兄弟ELK(ElasticSearch、Logstash、Kibana)。