容器日志

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

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

docker logs edc-k8s-demo
docker logs -f edc-k8s-demo

一些官方镜像的日志处理方式

  • nginx 官方镜像,使用了一种方式,让日志输出到 STDOUT,也就是 创建一个符号链接/var/log/nginx/access.log/dev/stdout
  • httpd 使用的是 让其输出到指定文件 ,正常日志输出到/proc/self/fd/1(STDOUT) ,错误日志输出到/proc/self/fd/2(STDERR)。
  • 当日志量比较大的时候,我们使用 docker logs 来查看日志,会对 docker daemon 造成比较大的压力,容器导致容器创建慢等一系列问题。
  • 只有使用了local 、json-file、journald的日志驱动的容器才可以使用 docker logs 捕获日志,使用其他日志驱动无法使用docker logs

Docker 日志 驱动

Docker 提供了两种模式用于将消息从容器到日志驱动。

  • (默认)拒绝,阻塞从容器到容器驱动
  • 非阻塞传递,日志将储存在容器的缓冲区。

当缓冲区满,旧的日志将被丢弃。

在 mode 日志选项控制使用 blocking(默认) 或者 non-blocking, 当设置为 non-blocking 需要设置 max-buffer-size 参数(默认为 1MB)。

支持的驱动

官方链接:Configure logging drivers | Docker Documentation

image-20220902160403360

使用 Docker-CE 版本,docker logs命令 仅仅适用于以下驱动程序

  • local
  • json-file
  • journald

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

其他几个logging driver解释如下:

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

Docker 日志驱动配置更改

修改日志驱动,在配置文件 /etc/docker/daemon.json(注意该文件内容是 JSON 格式的)进行配置即可。

示例:

{
  "log-driver": "syslog"
}

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

例如:

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

日志驱动配置参数

参考官方链接:View logs for a container or service | Docker Documentation