一、docker日志文件清理
df -h查看磁盘情况,overlay是docker的文件堆叠系统 满了的话清理其他目录对该文件不会起作用,不能直接进到目录里删除文件,会造成docker容器无法启动,可以用过清除docker系统的日志和清理无用镜像解决
docker image prune -a 清理全部未使用镜像(已退出容器在使用的镜像也不会被清理)
1.清理docker系统日志
/bin/bash
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 ========"
2.在docker的daemon.json中增加限制最大日志保留大小和数量
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m", #最大保留大小
"max-file": "5" #最大保存文件数量
}
}
添加配置后需要重启docker
二、nginx日志清理
1.需要紧急解决
awk -F'[][]' '$2 > "01/Jan/2024"' app.dingtax.cn.log > app.dingtax.cn.log(不会影响容器正常运行)
使用awk命令过滤出你需要保留日志的日期,然后把过滤出的日志重定向到源文件里,!!不要直接使用 最好先过滤看一下是不是自己需要留存的日志,如果日志格式不一样,需要自行切割。
2.添加日志清理定时任务
注意,脚本中的容器名需要按自己运行的容器修改,
#!/bin/bash
# 使用方法 */5 * * * * bash /opt/logcut.sh nginx目录或者/apps/logs应用目录
#
#
#日志目录
LOGDIR=$1
#日志保留天数
EXPAIDAY=14
#日志保存路径
ZIPDIR=/logs
#当前时间
DATE=$(date +%y-%m-%d-%H-%M-%S)
#####nginx日志处理函数
function nginxzip() {
if [ ! -d "$ZIPDIR/nginx" ]; then
mkdir -p $ZIPDIR/nginx
fi
NGINX_DIR=$1
DATE=$(date +%y-%m-%d-%H-%M-%S)
cd $NGINX_DIR
find ./ -name '*.log' | xargs gzip -9
docker exec openresty nginx -sreload
find ./ -name '*.log.gz' | xargs -I {} mv {} $ZIPDIR/nginx/{}.${DATE}.gz
}
#根分区使用率
root_uage=`df -h | grep -E '/$' | awk '{print $5}' | awk -F'%' '{print $1}'`
if (( $root_uage <= 60 )); then
nowdate=$(date +%d)
nowdate=`expr $nowdate + 0`
#判断时间戳文件是否存在不存在 即滚动一次
if [ -f "/tmp/lastdate" ]; then
lastdate=$(cat /tmp/lastdate)
else
lastdate=0
fi
#每天执行一次
if (( $lastdate != $nowdate )); then
nginxzip $LOGDIR
find /logs -name '*log*' -mtime +$EXPAIDAY -exec rm -rf {} \;
#写入时间戳
echo $nowdate > /tmp/lastdate
fi
###在存储空间使用小于80%做如下操作即可
elif (( $root_uage <= 80 )); then
nginxzip $LOGDIR
find /logs -name '*log*' -mtime +$EXPAIDAY -exec rm -rf {} \;
fi