文章

Bug:k8s中日志清理逻辑缺失

Bug:k8s中日志清理逻辑缺失

bug 描述

  • 现象:k8s 中 hb30-dat-push-logic-bcast-jjchess-liany-7b6bf96fc-czblz 的服务日志超过了 50G然后被驱逐重启了
  • 原因:一批机器中负责日志清理的脚本( tk_rm_zip_log.sh)中的路径写的不对,日志清理没有生效
  • 查运行的tk服务:
    ps -ef | grep tk
    
  • 具体错误:tk_rm_zip_log.sh 中的 LOGPATH 写的不对
  • 在 es 上筛选日志,条件如下所示,可以筛选出目标机器:

image-20251126165353819

bug修复

在 Linux 运维机 .7.84 中修改对应的服务中的 tk_rm_zip_log.sh 文件的路径,例:

1
LOGPATH=("/data/logs/tkserverlog/" "/data/logs/tkserverlog/_BakLog/") #注意目录以斜杠结束

运行命令 ./dc_sns_build.sh 1 打包服务,然后按照服务发布流程发布到服务器上。

附录:Linux 上的日志清理逻辑

脚本代码

(以下代码拷贝自 /data/tksns/test/tksnslogicservice/tk_rm_zip_log.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#! /bin/sh
CHECKTIME=3600 #1h
LOGPATH=("/data/logs/tkserverlog/" "/data/logs/tkserverlog/_BakLog/") #注意目录以斜杠结束
rmTIME=21600 #6h

while [ true ]; do
CURRENTDATE=`date '+%s'`
CURRENTTIME=`date "+%Y-%m-%d %H:%M:%S"`
sleep ${CHECKTIME}
echo ${CURRENTDATE}  ${CURRENTTIME}  "begin rm Check......."
for i in ${LOGPATH[@]}; do
    if [ ! -d $i ]; then
        mkdir $i
        echo "mkdir $i"
    fi
    arr=()
    for f in `ls $i |grep .tar`
    do
        if [ ! -f $i$f ]; then
            continue
        fi
        fullname=$i$f
        lastModName=`stat -c %Y ${fullname}`
        formartdate=`date '+%Y-%m-%d %H:%M:%S' -d @${lastModName}`
        let c=${rmTIME}+${lastModName}
        if [ ${CURRENTDATE} -gt $c ]; then
            echo ${fullname} ${lastModName} ${formartdate} "will be rmed!!!"
            arr[${#arr[@]}]=${fullname}
        fi


    done

    if [ ${#arr[@]} -le 0 ]; then
        continue
    fi

    echo `date "+%Y-%m-%d %H:%M:%S"` $f "rm Begin......"
    echo "rmFileName:"${arr[*]} 
    rm -rf   ${arr[*]}
    echo `date "+%Y-%m-%d %H:%M:%S"` $f "rm End......"
done

echo ${CURRENTDATE}  ${CURRENTTIME}  "  end rm Check"
done

这个Shell脚本是一个 定时清理指定目录下过期.tar格式日志压缩包 的自动化工具,核心作用是周期性删除超过6小时未修改的 .tar 日志压缩文件,避免日志文件占用过多磁盘空间。

脚本核心功能拆解

  1. 运行机制:无限循环执行,每1小时检查一次目标目录,符合条件的文件直接删除。
  2. 清理规则:删除 “最后修改时间超过6小时” 的 .tar 格式压缩文件(日志压缩包常见格式)。
  3. 目标目录:默认监控两个日志目录(支持扩展),目录不存在时会自动创建。

关键参数说明

参数名 数值 含义
CHECKTIME 3600 检查周期:3600秒 = 1小时(每1小时执行一次清理检查)
LOGPATH 两个目录路径 要监控的日志目录(必须以斜杠/结尾):
- /data/logs/tkserverlog/
- /data/eca/_BakLog/
rmTIME 21600 文件过期时间:21600秒 = 6小时(最后修改时间超过6小时的文件会被删除)

脚本执行流程(逐行解析核心逻辑)

1. 初始化与循环配置

1
2
3
4
while [ true ]; do  # 无限循环,持续运行
CURRENTDATE=`date '+%s'`  # 获取当前时间的时间戳(秒数,用于计算时间差)
CURRENTTIME=`date "+%Y-%m-%d %H:%M:%S"`  # 获取当前格式化时间(用于日志输出)
sleep ${CHECKTIME}  # 休眠1小时,之后开始本次检查

2. 目录合法性检查

1
2
3
4
5
for i in ${LOGPATH[@]}; do  # 遍历每个监控目录
    if [ ! -d $i ]; then  # 如果目录不存在
        mkdir $i  # 自动创建目录
        echo "mkdir $i"  # 输出创建日志
    fi

3. 筛选过期.tar文件

1
2
3
4
5
6
7
8
9
10
11
arr=()  # 初始化数组,存储要删除的文件路径
for f in `ls $i |grep .tar`; do  # 遍历目录下所有.tar后缀的文件
    fullname=$i$f  # 拼接完整文件路径
    lastModName=`stat -c %Y ${fullname}`  # 获取文件最后修改时间的时间戳
    formartdate=`date '+%Y-%m-%d %H:%M:%S' -d @${lastModName}`  # 格式化最后修改时间
    let c=${rmTIME}+${lastModName}  # 计算文件“过期时间戳”(最后修改时间+6小时)
    if [ ${CURRENTDATE} -gt $c ]; then  # 如果当前时间超过过期时间
        echo ${fullname} ${lastModName} ${formartdate} "will be rmed!!!"  # 输出待删除日志
        arr[${#arr[@]}]=${fullname}  # 将文件路径加入删除数组
    fi
done

4. 执行删除操作

1
2
3
4
5
6
7
if [ ${#arr[@]} -le 0 ]; then  # 如果没有待删除文件,跳过
    continue
fi
echo `date "+%Y-%m-%d %H:%M:%S"` $f "rm Begin......"  # 输出删除开始日志
echo "rmFileName:"${arr[*]}  # 列出所有要删除的文件路径
rm -rf ${arr[*]}  # 强制删除数组中的所有文件(-rf:递归+强制,避免确认提示)
echo `date "+%Y-%m-%d %H:%M:%S"` $f "rm End......"  # 输出删除结束日志

5. 循环收尾

1
echo ${CURRENTDATE} ${CURRENTTIME} "  end rm Check"  # 输出本次检查结束日志,进入下一轮循环

脚本适用场景

  • 用于服务器日志归档后的清理:通常日志会按天/按小时压缩为.tar包,保留6小时后自动删除,避免磁盘占满。
  • 适用于Linux环境(依赖stat -c %Y获取时间戳,Linux默认支持;macOS需调整stat参数)。

注意事项

  1. 目录路径必须以/结尾:脚本中fullname=$i$f直接拼接路径,若目录不以/结尾,会导致路径错误(如/data/logstkserverlogfile.tar)。
  2. 风险提示:rm -rf为强制删除,无法恢复,需确保LOGPATH配置正确(避免误删非日志目录)。
  3. 依赖工具:需确保系统安装stat命令(Linux默认自带,部分精简系统可能需要手动安装)。
  4. 日志输出:所有操作(创建目录、待删除文件、删除过程)都会打印到控制台,可通过重定向(如./script.sh >> /var/log/logclean.log 2>&1)保存日志。
本文由作者按照 CC BY 4.0 进行授权