合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
[TOC] Docker 日志分为两类: * 引擎日志:运行日志, * 容器日志:容器内的服务产生的日志。 # <span style="font-size:15px">**Docker 容器日志**</span> ## <span style="font-size:15px">**查看日志**</span> **1. 使用命令查看** > 命令:docker logs CONTAINER > * -f : 跟踪日志输出 > * --since :显示某个开始时间的所有日志 > * -t : 显示时间戳 > * --tail :仅列出最新N条容器日志 ``` 查看最近30分钟的日志: $ docker logs --since 30m f725238cfc79 查看某时间之后的日志: $ docker logs -t --since="2018-02-08T13:23:37" f725238cfc79 ​ 查看某时间段日志: $ docker logs -t --since="2018-02-08T13:23:37" --until "2021-02-09T12:23:37" f725238cfc79 ​ 实时查看docker容器日志,只显示最后100行 $ docker logs -f --tail=100 f725238cfc79 ``` &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UNIX 和 Linux 的命令有三种 输入输出,分别是 标准输入(STDIN)、标准输出(STDOUT)、标准错误输出(STDERR)。通过`docker logs`命令查看的容器日志,只包含容器的标准输出(STDOUT)与标准错误输出(STDERR)。 > nginx 官方镜像,使用了一种方式,让日志输出到 STDOUT,也就是 创建一个符号链接/var/log/nginx/access.log 到 /dev/stdout。 > httpd 使用的是 让其输出到指定文件 ,正常日志输出到 /proc/self/fd/1 (STDOUT) ,错误日志输出到 /proc/self/fd/2 (STDERR)。. ``` https://github.com/nginxinc/docker-nginx/blob/fef51235521d1cdf8b05d8cb1378a526d2abf421/mainline/debian/Dockerfile # forward request and error logs to docker log collector && ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log \ ``` &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果容器内部应用日志是输出到日志文件(比如Spring Boot项目或Tomcat容器,一般将日志输出到日志文件中),则无法通过 `docker logs` 命令查看。`docker logs` 会显示历史日志,日志数量过多时会对Docker Daemon造成一定的压力。可使用 `docker logs --tail 200 container_id`来查看最新的N条或使用`docker logs -f container_id`(类似于tail -f)。 <vr> **2. 通过日志文件查看** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当日志量比较大的时候,我们使用 docker logs 来查看日志,会对 docker daemon 造成比较大的压力,会导致容器创建慢等一系列问题,所以通过日志文件查看更合理。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;日志文件位置:`/var/lib/docker/containers/container_name/xxxx-json.log` ## <span style="font-size:15px">**日志清理**</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;docker启动容器必须有前台输出,为防止这些日志积累,我们需要清理或限制日志文件大小。 **1. 清空日志文件-临时解决方案** ``` cat /dev/null > c8c49aac99d86a501b8e2822d6db45d45cecc8781b6b0178a655c24f0ddc6d5a-json.log ``` &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里使用linux标准的空文件写入的方式来清空,而不是直接删除文件的方式,原因在于删除这个日志,容器并不会释放空间,需要重启容器。 **2. 单个容器限制日志大小** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第一种方式,通过配置容器docker-compose的max-size选项来实现,重启容器后即可生效。 ``` nginx: image: nginx:1.12.1 restart: always logging: driver: "json-file" options: max-size: "5g" ``` &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第二种方式,使用docker命令启动容器或者创建容器时,使用`--log-driver`标记来设置该容器的日志驱动。 ``` docker run --log-driver syslog --log-opt syslog-address=udp://1.2.3.4:1111 alpine echo hello world ``` **3. docker全局限制日志大小** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在`/etc/docker/daemon.json`中添加如下内容,限制容器文件大小为50m,可以存在的最大日志文件数。如果切割日志会创建超过阈值的文件数,则会删除最旧的文件。这个机制跟[日志驱动]()有关。 ``` { "log-driver":"json-file", "log-opts": {"max-size":"50m", "max-file":"3"} } ``` &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;修改之后,需要重启docker守护进程,此方法只对新建的容器起效:` systemctl daemon-reload && systemctl restart docker`。