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 上筛选日志,条件如下所示,可以筛选出目标机器:
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小时检查一次目标目录,符合条件的文件直接删除。
- 清理规则:删除 “最后修改时间超过6小时” 的 .tar 格式压缩文件(日志压缩包常见格式)。
- 目标目录:默认监控两个日志目录(支持扩展),目录不存在时会自动创建。
关键参数说明
| 参数名 | 数值 | 含义 |
|---|---|---|
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参数)。
注意事项
- 目录路径必须以
/结尾:脚本中fullname=$i$f直接拼接路径,若目录不以/结尾,会导致路径错误(如/data/logstkserverlogfile.tar)。 - 风险提示:
rm -rf为强制删除,无法恢复,需确保LOGPATH配置正确(避免误删非日志目录)。 - 依赖工具:需确保系统安装
stat命令(Linux默认自带,部分精简系统可能需要手动安装)。 - 日志输出:所有操作(创建目录、待删除文件、删除过程)都会打印到控制台,可通过重定向(如
./script.sh >> /var/log/logclean.log 2>&1)保存日志。
本文由作者按照
CC BY 4.0
进行授权
