环境:linux 工具:shell 适用范围:适用于任何后缀的日志文件分割,默认为*.log的日志文件

描述:支持指定的同一目录下,自定义多日志进行分割、自定义保存日志天数。会在同级目录下生成./log/2024/05/xxxx_20240501.log  这种形式的日志

#!/bin/bash
#variable
#变量区,日志路径,不要精确到文件,日志文件名字,不要后缀.* ,日志保留天数
log_files_path=""
log_files_name=()
save_days=

log_files_dir=${log_files_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")
log_del= ${log_files_path}$(date -d "yesterday" +"%Y")/
mkdir -p $log_files_dir
log_files_num=${#log_files_name[@]}

#mode-1——以move方式移动日志,大部分需要reload相关服务
#以移动日志文件的方式来做切割,适用于会自动创建日志文件场合
#for((i=0;i<$log_files_num;i++));do
#mv ${log_files_path}${log_files_name[i]}.log ${log_files_dir}/${log_files_name[i]}_$(date -d #"yesterday" +"%Y%m%d").log
#done

#mode-2——以cp形式复制日志内容,根据crontab计划任务来决定频率
#以对文件内容进行切割的方式来进行日志切割
for((i=0;i<$log_files_num;i++));do
cp ${log_files_path}${log_files_name[i]}.log ${log_files_dir}/${log_files_name[i]}_$(date -d "yesterday" +"%Y%m%d").log
echo ‘’ > ${log_files_path}${log_files_name[i]}.log
done

#通过文件创建日期为条件的方式来删除指定天数以上的日志
find $log_del -type f -mtime +$save_days -exec rm -rf {} \; 

#完事,crontab -e 加入循环即可,按需设定频率

模式二

#!/bin/bash
#描述:不同点,不以时间函数,以文件名称的日期大小对比方式来删除过期脚本
#距离生成的文件名都是20240513_xxxxxx.log  通过对比前8位“20240513”数字的大小来删除指定日期以外的日志
log_files_path=""
log_files_name=()
DAYS_AGO=
log_files_dir=${log_files_path}/log/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")
mkdir -p $log_files_dir
DIRECTORY=${log_files_dir}
cp ${log_files_path}/log/${log_files_name}.log ${log_files_dir}/log/$(date -d "yesterday" +"%Y%m%d").log
echo '' > ${log_files_path}${log_files_name}.log 
THRESHOLD_DATE=$(date -d "${DAYS_AGO} days ago" +%Y%m%d)  
echo “检查$THRESHOLD_DATE前的文件”  
find "$DIRECTORY" -type f -name '*.out' | while read -r file ; do  
    FILE_DATE=$(basename "$file" | grep -oP '\d{8}')  
    echo "$file"
    echo "比较  $FILE_DATE 和 $THRESHOLD_DATE" 
   if [ "$FILE_DATE" -le "$THRESHOLD_DATE" ]; then  
        echo "del $file"  
        rm "$file"   
    fi  
done



以下是测试板块,仅通过自测

#testing项目,删除./2024年(举例,脚本可以自动识别年)下的非本月的目录
#获取本月月份以及获取2024目录下有多少个月份目录
date=`date "+%Y-%m-%d" | awk -F '-' '{print $2}'`
doc=`find  $file_del -type d`
#带入循环,如果这个月份用du -sh 查看只有1行且这行的第一列为0,则说明本月份目录下没有日志文件,直接删除。如果目录名称为本月月份则不用管
for i in $doc
do
  if [ $date   !=  $i ];then
   test1=`du -sh $file_del$i | awk -F ''  '{print $1}'`
   test2=`du -sh $file_del$i | wc -l`
     if [ $test1 == 0  ] || [ $test1 == 1  ];then
       rm -rf $file_del$i
     fi
  fi
done

#如果有年目录下,删除过期月份目录的代码的需求,此项模块为测试代码,未用于实际环境

总结:支持写死绝对路径情况下的多日志分割,会在日志所在的目录绝对路径下生成子目录 ./2024/05/(每几天分割的日志位置) 缺点:针对于不同格式的日志例如*.log、*.out等等,需要改下脚本内对应的后缀名(cp、mv) 的内容。暂时无法做到可以自动识别所有后缀格式的日志