程序员小乐
正文
本文所有内容基于:
Docker-CE
Server Version: 18.09.6
Storage Driver: overlay2
Kernel Version: 3.10.0-862.el7.x86_64
Operating System: CentOS Linux 7 (Core)
Docker 日志分为两类:
- Docker 引擎日志(也就是 dockerd 运行时的日志),
- 容器的日志,容器内的服务产生的日志。
一 、Docker 引擎日志
Docker 引擎日志一般是交给了 Upstart(Ubuntu 14.04) 或者 systemd (CentOS 7, Ubuntu 16.04)。前者一般位于 /var/log/upstart/docker.log 下,后者我们一般 通过 journalctl -u docker 来进行查看。
| 系统 | 日志位置 |
| ---------------------- | ------------------------------------------------------------ |
| Ubuntu(14.04) | `/var/log/upstart/docker.log` |
| Ubuntu(16.04) | `journalctl -u docker.service` |
| CentOS 7/RHEL 7/Fedora | `journalctl -u docker.service` |
| CoreOS | `journalctl -u docker.service` |
| OpenSuSE | `journalctl -u docker.service` |
| OSX | `~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/log/docker.log` |
| Debian GNU/Linux 7 | `/var/log/daemon.log` |
| Debian GNU/Linux 8 | `journalctl -u docker.service` |
| Boot2Docker | `/var/log/docker.log` |
二、容器日志
2.1、常用查看日志命令——docker logs
docker logs CONTAINER 显示当前运行的容器的日志信息, UNIX 和 Linux 的命令有三种 输入输出,分别是 STDIN(标准输入)、STDOUT(标准输出)、STDERR(标准错误输出),docker logs 显示的内容包含 STOUT 和 STDERR。在生产环境,如果我们的应用输出到我们的日志文件里,所以我们在使用 docker logs 一般收集不到太多重要的日志信息。
- 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`
2.2 、Docker 日志 驱动
Docker 提供了两种模式用于将消息从容器到日志驱动。
- (默认)拒绝,阻塞从容器到容器驱动
- 非阻塞传递,日志将储存在容器的缓冲区。
当缓冲区满,旧的日志将被丢弃。
在 mode 日志选项控制使用 blocking(默认) 或者 non-blocking, 当设置为 non-blocking 需要设置 max-buffer-size 参数(默认为 1MB)。
支持的驱动
| | 描述 |
| :----------------------------------------------------------- | :----------------------------------------------------------- |
| `none` | 运行的容器没有日志,`docker logs`也不返回任何输出。 |
| [`local`](https://docs.docker.com/config/containers/logging/local/) | 日志以自定义格式存储,旨在实现最小开销。 |
| [`json-file`](https://docs.docker.com/config/containers/logging/json-file/) | 日志格式为JSON。Docker的默认日志记录驱动程序。 |
| [`syslog`](https://docs.docker.com/config/containers/logging/syslog/) | 将日志消息写入`syslog`。该`syslog`守护程序必须在主机上运行。 |
| [`journald`](https://docs.docker.com/config/containers/logging/journald/) | 将日志消息写入`journald`。该`journald`守护程序必须在主机上运行。 |
| [`gelf`](https://docs.docker.com/config/containers/logging/gelf/) | 将日志消息写入Graylog扩展日志格式(GELF)端点,例如Graylog或Logstash。 |
| [`fluentd`](https://docs.docker.com/config/containers/logging/fluentd/) | 将日志消息写入`fluentd`(转发输入)。该`fluentd`守护程序必须在主机上运行。 |
| [`awslogs`](https://docs.docker.com/config/containers/logging/awslogs/) | 将日志消息写入Amazon CloudWatch Logs。 |
| [`splunk`](https://docs.docker.com/config/containers/logging/splunk/) | 使用HTTP事件收集器将日志消息写入`splunk`。 |
| [`etwlogs`](https://docs.docker.com/config/containers/logging/etwlogs/) | 将日志消息写为Windows事件跟踪(ETW)事件。仅适用于Windows平台。 |
| [`gcplogs`](https://docs.docker.com/config/containers/logging/gcplogs/) | 将日志消息写入Google Cloud Platform(GCP)Logging。 |
| [`logentries`](https://docs.docker.com/config/containers/logging/logentries/) | 将日志消息写入Rapid7 Logentries。 |
使用 Docker-CE 版本,docker logs命令 仅仅适用于以下驱动程序(前面 docker logs 详解也提及到了)
- local
- json-file
- journald
1558055133186
Docker 日志驱动常用命令
查看系统当前设置的日志驱动
docker info |grep "Logging Driver" / docker info --format '{{.LoggingDriver}}'
查看单个容器的设置的日志驱动
docker inspect -f '{{.HostConfig.LogConfig.Type}}' 容器id
Docker 日志驱动全局配置更改
修改日志驱动,在配置文件 /etc/docker/daemon.json(注意该文件内容是 JSON 格式的)进行配置即可。
示例:
{
"log-driver": "syslog"
}
以上更改是针对所有的容器的日志驱动的。我们也可以单独为单一容器设置日志驱动。
Docker 单一容器日志驱动配置
在 运行容器的时候指定 日志驱动 --log-driver。
docker run -itd --log-driver none alpine ash # 这里指定的日志驱动为 none
日志驱动 一 、local
local 日志驱动 记录从容器的 STOUT/STDERR 的输出,并写到宿主机的磁盘。
默认情况下,local 日志驱动为每个容器保留 100MB 的日志信息,并启用自动压缩来保存。(经过测试,保留100MB 的日志是指没有经过压缩的日志)
local 日志驱动的储存位置 /var/lib/docker/containers/容器id/local-logs/ 以 container.log 命名。
local 驱动支持的选项
| 选项 | 描述 | 示例值 |
| :--------- | :----------------------------------------------------------- | :------------------------- |
| `max-size` | 切割之前日志的最大大小。可取值为(k,m,g), 默认为20m。 | `--log-opt max-size=10m` |
| `max-file` | 可以存在的最大日志文件数。如果超过最大值,则会删除最旧的文件。**仅在max-size设置时有效。默认为5。 | `--log-opt max-file=3` |
| `compress` | 对应切割日志文件是否启用压缩。默认情况下启用。 | `--log-opt compress=false` |
全局日志驱动设置为—local
在配置文件 /etc/docker/daemon.json(注意该文件内容是 JSON 格式的)进行配置即可。
{
"log-driver": "local