Docker 容器日志管理

查看容器日志

Docker Daemon 启动容器后,会创建协程去接收容器内的标准输出,并通过 JSON 格式存放到 data-root 目录下的 containers 目录,没有特殊配置时一般是/var/lib/docker/containers

使用命令可以查询容器日志

shell 复制代码
docker logs [参数] <容器名>

其他参数

css 复制代码
--details         显示更多的信息
-f, --follow      跟踪实时日志
--since string    显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
--tail string     从日志末尾显示多少行日志, 默认是all
-t, --timestamps  显示时间戳
--until string    显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

当日志太多时需要跟踪日志,一般使用

shell 复制代码
docker logs -f <容器名> --tail=50 # 从最后 50 行开始看

对打印日志内容过滤

shell 复制代码
docker logs -f <容器名> 2>&1 | grep <搜索字符串>

配置日志限制

当容器日志太多时,查看不方便,磁盘占用大,因此需要对日志进行限制

全局配置

json 复制代码
# vim /etc/docker/daemon.json

{
  "log-driver":"json-file",
  "log-opts": {"max-size":"100m", "max-file":"10"}
}

log-opts 可配置单文件最大占用、文件最大数量

log-driver 配置 log 驱动,默认 json-file,还支持 syslog、fluentd 等

重启生效,但这种配置无法影响已有容器

单容器配置

在容器启动命令中添加参数配置日志

shell 复制代码
docker run --log-opt max-size=10m --log-opt max-file=10 <...>

同样可以指定 log-opt,优先级比全局配置高

使用日志轮转工具

对于一些场景,可能需要专门的日志轮转工具

  • 对于已经在跑的容器,无法通过配置来限制日志
  • 容器的一些其他 log 并非容器标准日志,不能通过配置 docker 来管理

logrotate 是一个古老的日志轮转命令工具,大多数 Linux 发行版已经内置,主要的功能是日志分片和清理

logrotate 命令使用方式

shell 复制代码
lograotate -s <轮转状态文件> <轮转配置文件>
# 其他参数
# -d debug 模式,不会真正执行,会打印执行结果
# -f 强制轮转,不管有没有达到轮转条件,如时间、文件大小
# -v 显示轮转过程信息

轮转状态文件默认是 /var/lib/logotate/下的 status 文件,记录了各种日志文件被轮转的时间

logrotate 的配置文件是/etc/logrotate.conf

shell 复制代码
weekly
rotate 4
create
include /etc/logrotate.d

默认配置文件配置了include /etc/logrotate.d,该目录下的所有配置文件都会生效,一般可以针对一种 log 创建一种轮转配置,放到 logrotate.d 目录下

logrotate 配置方式

shell 复制代码
/home/cade/test.log {
        daily        # 每日执行
        rotate 3     # 保留 3 个日志分片
        missingok    # 文件不存在时不报错
        dateext      # 后缀使用日期
        copytruncate # 复制原 log 文件后,清空文件内容
}

其他 logrotate 配置项

shell 复制代码
daily | weekly | monthly | yearly # 轮转周期条件
ifempty                           # 日志没有内容的时候也进行轮替
notifempty                        # 若日志为空,则不进行轮替
size                              # 日志大小达到多少后进行轮转,和轮转周期条件是 OR 的关系
minsize                           # 日志大小一定要超过多少后才轮转
nocompress                        # 轮替但不进行压缩
compress                          # 压缩轮替文件
dateext                           # 后缀-%Y %m %d形式日期,默认用序号
dateformat                        # 对日期后缀进行格式定制
sharedscripts                     # 所有日志轮转完成后,执行一遍脚本,不配置则重复执行
prerotate/endscript	              # 轮转之前执行,成对出现。
postrotate/endscript              # 轮转之后执行,成对出现。
olddir                            # 将旧日志移至指定目录下

# 生成日志的方式
create <权限数字> <文件所有者> <文件所有组> # 如 create 777 root root
# 重命名文件,生成新 log 文件,需要通知应用程序重新打开日志
copytruncate
# 复制原文件后,清空内容,不需要应用程序支持

logrotate 默认被系统自动按天调度,/etc/cron.daily目录下有一个 logrotate 脚本,该目录下的脚本将会按天调度

如果需要按小时调度,可以将该脚本放入/etc/cron.hourly,或者使用 crontab -e 自定义一个定时任务

相关推荐
杨浦老苏34 分钟前
开源服务运行监控工具Lunalytics
docker·群晖·网站监控
还是奇怪2 小时前
Linux - 安全排查 2
linux·运维·安全
牛奶咖啡132 小时前
Linux系统的常用操作命令——文件远程传输、文件编辑、软件安装的四种方式
运维·服务器·软件安装·linux云计算·scp文件远程传输·vi文件编辑·设置yum的阿里云源
难受啊马飞2.02 小时前
如何判断 AI 将优先自动化哪些任务?
运维·人工智能·ai·语言模型·程序员·大模型·大模型学习
会又不会2 小时前
Jenkins-Email Extension 插件插件
运维·jenkins
电脑能手3 小时前
[保姆级教程] 解决不同局域网电脑无法SSH的问题
运维·ssh·电脑
czhc11400756633 小时前
Linux 76 rsync
linux·运维·python
你不知道我是谁?4 小时前
负载均衡--四层、七层负载均衡的区别
运维·服务器·负载均衡
dyj0955 小时前
【Rancher Server + Kubernets】- Nginx-ingress日志持久化至宿主机
运维·nginx·rancher
码出钞能力6 小时前
linux内核模块的查看
linux·运维·服务器