运维:定时压缩存储和清理docker容器的日志

日志清理建议

  • 在我的职业生涯中,生产环境的磁盘爆满问题,遇到过不止一次。这个问题易于排查、易于处理,但破坏力惊人。磁盘爆满后,服务可能直接停止服务,或者部分停止服务(无法写文件、生成验证码、保存数据等)
  • 生产环境的日志清理是维护系统正常运行的重要任务。以下是一些常见的建议和最佳实践:
  1. 制定清理策略:根据系统日志产生的频率和大小,制定合适的清理策略。可以按天、按周或按月删除旧日志文件,也可以根据日志文件总大小达到一定阈值时清理旧日志。
  2. 保留必要的日志:为了排查系统问题和处理事故,需要保留一定的历史日志。可以设置一个保留时间或保留数量,保留最近的一定时间或数量的日志文件,而删除更早的日志。
  3. 自动化清理:使用自动化脚本定期清理日志,可以避免手动清理带来的疏漏和错误。同时,需要确保清理操作不会影响到系统运行。
  4. 定期备份:在删除旧日志之前,需要先进行备份,以防需要恢复历史日志进行排查。可以将备份保存在不同的地方,以应对意外情况。
  5. 监控日志文件大小:监控系统日志文件的大小,当文件大小达到预设阈值时提醒管理员清理或备份日志。这样可以让系统管理员及时了解系统日志的状态,避免因为日志文件过大而导致存储空间不足的问题
  • 总之,生产环境的日志清理是一个需要谨慎处理的任务,需要灵活制定清理策略,并且定期执行,以保障系统的稳定性和安全性

docker服务日志介绍

  • Docker服务的日志是指Docker容器或Docker守护进程输出的信息,主要用于诊断和故障排除
  • Docker服务的日志可以通过以下三种方式获取:
  1. 直接查看容器内部的日志文件:使用docker logs命令可以查看指定容器的日志输出,比如docker logs my-nginx
  2. 使用Docker守护进程输出控制台日志:Docker守护进程可以通过–log-driver参数设置输出日志的方式,包括json-file、syslog、journald等。例如,使用以下命令使用syslog输出日志:dockerd --log-driver=syslog
  3. 使用第三方日志集成工具:例如,使用ELK堆栈对Docker容器的日志进行收集、聚合和分析,以便更好地管理Docker容器的日志。
  • Docker服务的日志可以包括容器启动信息、运行中的应用程序日志、容器异常错误信息等
  • 开发人员和运维人员可以通过对Docker服务的日志进行分析来了解Docker容器的运行状态,并快速诊断和解决问题。
  • 介绍下我常用的查看日志的几个命令
    • 查看最新100行:docker logs -f --tail 100 服务名称
    • 查看所有行:docker logs -f 服务名
    • 复制docker日志到指定位置:docker logs 服务名称 > /home/log1.log
    • 一些辅助参数也都可以加,如grep

清理脚本介绍

  • 找到目录,docker服务日志都在容器里面,一般在/var/lib/docker/containers/文件夹下面,我们可以用$(find /var/lib/docker/containers/ -name *-json.log)找到这些文件所在的目录
  • 压缩,已有的日志文件,可以按照日期作为文件名进行压缩tar -zcvf ${curDay}.tgz $FILE(此处注意,要cd到对应位置执行)
  • 删除超过规定天数的日志文件,主要是排序和删除
  • 该docker日志清理脚本logs-clean.sh内容如下:
echo "======== start clean docker containers logs ========"
  
# docker日志目录
logs=$(find /var/lib/docker/containers/ -name *-json.log)
# 当前日期
curDay=$(date "+%Y-%m-%d")
echo ${curDay}
# 保留文件数
ReservedNum=10

for log in $logs
        do
          echo "clean logs : $log"
          # 去日志所在目录,按日期压缩并清空日志
          cd ${log%/*}
          FILE=${log##*/}
          tar -zcvf ${curDay}.tgz $FILE
          cat /dev/null > $log
          # 删除多余天数的日志
          #*.tgz表示筛选文件类型,去掉则针对整个目录的文件
          FileNum=$(ls -l  ./*.tgz |grep ^- |wc -l)
          while(( FileNum > ReservedNum))
          do
            OldFile=$(ls -rt  ./*.tgz| head -1)
            rm -f $OldFile
            let "FileNum--"
          done
        done  
  • 最后将脚本加入Linux的定时任务crontab,可以手动加一下,也可以把下面这段加到上面的logs-clean.sh脚本里,执行一次即可
if cat '/etc/crontab' | grep "logs-clean" > /dev/null
then
    echo "logs-clean已加入重启脚本"
else
	echo "将logs-clean加入服务器重启脚本"
	echo "0 0 * * * /home/logs-clean.sh >> /home/protect_run.log 2>&1" >> /etc/crontab
fi
  • 使用此脚本后,基本上能杜绝因为docker容器日志导致的磁盘满的问题
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

坚持是一种态度

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

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

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

打赏作者

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

抵扣说明:

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

余额充值