文章目录
- 日志清理建议
- docker服务日志介绍
- 清理脚本介绍
日志清理建议
- 在我的职业生涯中,生产环境的磁盘爆满问题,遇到过不止一次。这个问题易于排查、易于处理,但破坏力惊人。磁盘爆满后,服务可能直接停止服务,或者部分停止服务(无法写文件、生成验证码、保存数据等)
- 生产环境的日志清理是维护系统正常运行的重要任务。以下是一些常见的建议和最佳实践:
- 制定清理策略:根据系统日志产生的频率和大小,制定合适的清理策略。可以按天、按周或按月删除旧日志文件,也可以根据日志文件总大小达到一定阈值时清理旧日志。
- 保留必要的日志:为了排查系统问题和处理事故,需要保留一定的历史日志。可以设置一个保留时间或保留数量,保留最近的一定时间或数量的日志文件,而删除更早的日志。
- 自动化清理:使用自动化脚本定期清理日志,可以避免手动清理带来的疏漏和错误。同时,需要确保清理操作不会影响到系统运行。
- 定期备份:在删除旧日志之前,需要先进行备份,以防需要恢复历史日志进行排查。可以将备份保存在不同的地方,以应对意外情况。
- 监控日志文件大小:监控系统日志文件的大小,当文件大小达到预设阈值时提醒管理员清理或备份日志。这样可以让系统管理员及时了解系统日志的状态,避免因为日志文件过大而导致存储空间不足的问题
- 总之,生产环境的日志清理是一个需要谨慎处理的任务,需要灵活制定清理策略,并且定期执行,以保障系统的稳定性和安全性
docker服务日志介绍
- Docker服务的日志是指Docker容器或Docker守护进程输出的信息,主要用于诊断和故障排除
- Docker服务的日志可以通过以下三种方式获取:
- 直接查看容器内部的日志文件:使用docker logs命令可以查看指定容器的日志输出,比如docker logs my-nginx
- 使用Docker守护进程输出控制台日志:Docker守护进程可以通过–log-driver参数设置输出日志的方式,包括json-file、syslog、journald等。例如,使用以下命令使用syslog输出日志:dockerd --log-driver=syslog
- 使用第三方日志集成工具:例如,使用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容器日志导致的磁盘满的问题