容器日志
2022-09-02
默认情况下,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
使用 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