Docker 容器日志

389 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

docker 容器日志若不及时清理,则很容易导致主机磁盘空间满了,影响正常业务运行。

容器日志命令

docker logs 参数 容器id 查看容器日志.

参数:

  • -t 显示时间戳
  • -f实时查看日志打印
  • -since 时间 显示自某个 timestamp 之后的日志,或相对时间
  • –until 时间 显示自某个 timestamp 之前的日志,或相对时间
  • --tail 数字 显示最后多少条日志

eg:

查看指定时间后的日志,只显示最后100行:
$ docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID

查看最近30分钟的日志:
$ docker logs --since 30m CONTAINER_ID

查看某时间之后的日志:
$ docker logs -t --since="2018-02-08T13:23:37" CONTAINER_ID

查看某时间段日志:
$ docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID

查看容器日志文件

  在 linux 上, Docker 容器日志默认存放在 /var/lib/docker/containers/container_id/下面, 以 容器ID + -json.log结尾的文件就是该容器的日志文件.

查看各个日志文件大小的 shell 脚本如下:

#!/bin/sh
echo "======== docker containers logs file size ========"  
logs=$(find /var/lib/docker/containers/ -name *-json.log)  
for log in $logs  
  do  
    ls -lh $log   
  done

清理正在运行的容器的日志(治标)

如果 docker 容器正在运行, 那么使用 rm -rf 方式删除日志后, 通过 df -h 会发现磁盘空间并没有释放.

原因是在 Linux 系统中, 通过 rm -rf 或者文件管理器删除文件, 将会从文件系统的目录结构上解除链接(unlink). 如果文件是被打开的(有一个进程正在使用), 那么进程将仍然可以读取该文件, 磁盘空间也一直被占用. 正确姿势是 cat /dev/null > *-json.log, 当然你也可以通过 rm -rf 删除后重启 docker.

  编写一个日志清理脚本内容如下:

#!/bin/sh

echo "======== start clean docker containers logs ========"  
logs=$(find /var/lib/docker/containers/ -name *-json.log)  
for log in $logs  
  do  
    echo "clean logs : $log"  
    cat /dev/null > $log  
  done
echo "======== end clean docker containers logs ========"

  使用脚本 :

# chmod +x clean_docker_log.sh

# ./clean_docker_log.sh

但是, 这样清理之后, 随着时间的推移, 容器的日志依旧会占据很大的空间.

设置 Docker 容器的日志大小 ( 治本 )

① 设置一个容器服务的日志大小上限

在启动容器的时候增加一个参数设置该容器的日志大小, 及日志驱动.

--log-driver json-file 日志驱动

--log-opt max-size=[0-9+][k|m|g] 文件的大小

--log-opt max-file=[0-9+] 文件数量

然后重启 docker 守护进程:

// 重启 docker 守护进程
# systemctl daemon-reload
# systemctl restart docker

② 全局设置

  编辑文件 /etc/docker/daemon.json, 增加以下日志的配置.

"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"}

  max-size=500m, 意味着一个容器日志大小上限是 500M,

  max-file=3, 意味着一个容器有三个日志, 分别是 id+.json, id+1.json, id+2.json.

  然后重启 docker 守护进程.