教你搞定Docker容器日志问题

文章目录

  • 一、容器日志工具docker logs
    • 1、常用选项:
    • 2、常用日志查看命令
      • 2.1 跟随日志输出
      • 2.2 显示带时间戳的日志
      • 2.3 从指定时间开始显示日志
      • 2.4 显示最后 10 行日志
      • 2.5 显示额外详细信息的日志
      • 2.6 显示直到指定时间的日志
  • 二、容器日志驱动
    • 1、日志驱动类型
    • 2、配置默认的日志驱动
    • 3、查看当前默认的日志驱动
    • 4、配置容器的日志驱动
  • 三、容器日志清理
    • 1、手动清理运行容器的日志
    • 2、运行容器时设置轮转策略(推荐)
      • 1、设置缺省的轮转策略
    • 2、运行容器时设置轮转策略
  • 四、最佳实践

某日运维反馈某个容器应用出现异常,主要表现为数据写入功能失效。初步排查时,使用 docker logs 查看容器日志未发现明显报错。随后通过 df -h 检查服务器磁盘状态,发现磁盘占用已达100%。进一步使用 du 命令分析,定位到 docker/volumes 目录占用了数十GB空间,其中容器日志文件是主要成因。通过删除并重建容器,成功释放磁盘空间,应用功能随即恢复正常。

这次事故暴露出容器日志管理的重要性。本文将系统梳理Docker日志的收集、轮转和清理方案,帮助读者避免同类问题。主要内容包括:Docker日志的存储机制、日志轮转配置方法、清理方案、最佳实践建议。

一、容器日志工具docker logs

Docker自带的docker logs命令输出正在运行的容器的日志信息,而docker service logs命令显示服务中的所有容器的日志信息(这个命令适用于集群环境)。

1、常用选项:

-f, --follow: 跟随日志输出(类似于 tail -f)。
--since: 从指定时间开始显示日志。
-t, --timestamps: 显示日志时间戳。
--tail: 仅显示日志的最后部分,例如 --tail 10 显示最后 10 行。
--details: 显示提供给日志的额外详细信息。
--until: 显示直到指定时间的日志。

2、常用日志查看命令

2.1 跟随日志输出

docker logs -f my_container

输出内容:

hello world
hello world
hello world

2.2 显示带时间戳的日志

显示包含时间戳的日志

docker logs -t my_container

输出内容:

2023-07-22T15:04:05.123456789Z hello world
2023-07-22T15:04:06.123456789Z hello world
2023-07-22T15:04:07.123456789Z hello world

2.3 从指定时间开始显示日志

显示 2023-07-22T15:00:00 之后的日志。

docker logs --since="2023-07-22T15:00:00" my_container

2.4 显示最后 10 行日志

显示 my_container 的最后 10 行日志。

docker logs --tail 10 my_container

2.5 显示额外详细信息的日志

显示 my_container 的日志,并包含额外详细信息。

docker logs --details my_container

2.6 显示直到指定时间的日志

显示 2023-07-22T16:00:00 之前的日志。

docker logs --until="2023-07-22T16:00:00" my_container

二、容器日志驱动

1、日志驱动类型

Docker默认的日志驱动是json-file。在启动容器时可以通过--log-driver选项配置日志驱动。

选项值说明
none禁用容器日志,docker logs 命令不会输出任何日志信息
json-fileDocker默认的日志驱动。该驱动将日志保存在JSON文件中,Docker 负责格式化其内容并输出到STDOUT和STDERR
syslog将日志信息写入syslog日志系统,syslog守护进程必须在主机上运行
journald将日志信息写入joumald 日志系统,joumald 守护进程必须在主机上运行
gelf将日志信息写入像Graylog 或 Logstash这样的GELF(Graylog Extended Log Format)终端
fluentd将日志信息写入fluentd, fuentd守护进程必须在主机上运行
splunksplunk 将日志信息写入使用 HTTP 事件搜集器的 splunk

使用Docker CE时,docker logs 命令只能用于localjson-filejournald日志驱动。

2、配置默认的日志驱动

daemon.json文件Linux主机中一般位于/etc/docker目录Windows中一般位于C:ProgramData\Docker\config)中的log-driver值设为日志驱动名称即可配置驱动。

# 默认的日志驱动是json-file, 下面实例将其设置为syslog
 {
     "log-driver":"syslog"
 }

如果日志驱动有可配置的选项,则可以在daemon.json文件的关键字log-opts中以JSON格式设置。

 # 为json-file日志驱动设置了四个可配置选项
{
    "log-driver":"json-file",
    "log-opts":{
        "labels":"production_status",
        "env":"os,customer",
       "max-size": "10m",
       "max-file": "5"
    }
}
# 默认驱动就是json-file,因此使用docker inspect命令之类的默认输出就是JSON格式

3、查看当前默认的日志驱动

docker info | grep 'Logging Driver'

4、配置容器的日志驱动

启动容器时,通过--log-driver选项将其匹配成与Docker守护进程使用不同的日志驱动。如果日志驱动有可配置选项,则可通过一个或多个选项(--log-opt<名称>=<值>)进行设置。

docker run -d \
  --name myapp \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  myapp:latest

三、容器日志清理

Docker 默认使用的是 json-file 日志驱动。日志会一直写,一直写,一直写……没有限制、没有轮转、没有清理!

日志默认位置:/var/lib/docker/containers//-json.log

1、手动清理运行容器的日志

容器的日志文件会占据大量的磁盘空间。在Linux中,容器日志一般放在/var/lib/docker/containers/container_id目录下以josn.log结尾的文件中。清空对应文件即可清理日志,以下是全集,但仅限于临时使用:

echo "" > $(docker inspect --format='{{.LogPath}}' <container-id>)
# 或者
find /var/lib/docker/containers -name *-json.log -exec truncate -s 0 {} \;

或者更稳一点:

docker stop 停掉容器
docker rm 删除容器
使用轮转参数重新 run容器

这里提供一个shell脚本清理正在运行的容器的日志:

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

2、运行容器时设置轮转策略(推荐)

根本上解决日志占用空间问题–限制容器的日志大小上限。在deamon.json配置文件中为Docker守护进程设置日志驱动时,可通过log-opts选项来限制日志大小的上限。

1、设置缺省的轮转策略

# 为json-file日志驱动设置了四个可配置选项
 {
   "log-driver":"json-file",
   "log-opts":{
       "labels":"production_status",
       "env":"os,customer",
      "max-size": "10m",
      "max-file": "5"
   }
 }

2、运行容器时设置轮转策略

docker run -d \
  --name myapp \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  myapp:latest

四、最佳实践

• 用 json-file + max-size + max-file
• 修改 daemon.json 设置全局默认
• 老容器要么清理日志,要么重启带轮转参数根据不同场景推荐配置值。

场景建议参数
开发环境max-size=5,mmax-file=3
测试环境max-size=10mmax-file=5
生产环境max-size=50mmax-file=10

Docker 日志默认设置太坑,一定要手动配置!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bjzhang75

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值