#!/bin/bash
# 获取昨天时间,时间格式: 2019-07-05
date1=$(date -d -1days +%F)
# 定义服务列表,每项代表一个服务
app=('app1' 'app2' 'app3' 'app4')
# 遍历服务列表
for i in ${app[@]}
do
# 定义日志的路径,必须和实际的日志路径保持一致
dir=/home/centos/$i/logs
# 切换到指定服务日志的目录下
cd $dir
# 将catalina.out文件拷贝为catalina.2019-07-05,同时下一步操作把catalina.out文件清空,达到每天每天一个日志文件的效果
# 如果日志已经是每天生成一个单独的文件,需要注释这两行
cp catalina.out catalina.$date1
echo '' > catalina.out
# 将catalina.2019-07-05文件压缩成名为catalina.2019-07-05.tar.gz的归档文件,--remove-files是在压缩成功结束后,删除源文件
tar -Pzcf catalina.$date1.tar.gz catalina.$date1 --remove-files
# 删除当前服务日志目录30天之前的文件
find $dir -atime +30 -exec rm -f {} \;
#删除7天之前的log文件
# find $dir -atime +7 -name "*log*" -exec rm -f {} \;
done
#00 00 * * * /to/path/clean_log.sh
日志清理压缩脚本说明:
1. 需要了解当前服务日志输出的文件名
2. 将脚本中的服务列表更改为自己的服务对应的目录名,手动执行进行测试脚本能不能正常运行
3. 给脚本添加执行权限(chmod +x clean_log.sh),添加到定时任务(crontab -e)
4. 重启crond服务,确保crontab任务正常执行
5. 当前服务器的脚本只能在当前服务器执行,不支持跨机器,多个服务器需要定义多个脚本
or 2
#!/bin/bash
#funtion
clean_log () {
dir=/home/tomcat/$1/logs
find $dir -atime +7 -exec rm -f {} \;
}
logs_ls () {
dir=/home/tomcat/$1/logs
sum=`ls $dir | wc -l`
echo "$1 logfile count is [${sum}]"
}
list_tomcat=('flow' 'sso' 'utr' 'uc' 'bid' 'portal-xm' 'sso-xm' 'bid-xm' 'cms-xm' 'flow-xm' 'uc-xm' 'utr-xm' 'utrj-xm' 'portal')
for i in ${list_tomcat[@]};
do
clean_log $i
logs_ls $i
done
exit 0
or 3
#!/bin/bash
date1=$(date -d -1days +%Y-%m-%d-%H_%M)
#funtion
clean_log () {
dir=/home/tomcat/$1/logs
cd $dir
cp catalina.out catalina.$date1
echo '' > catalina.out
tar -Pzcf catalina.$date1.tar.gz catalina.$date1 --remove-files
find $dir -atime +30 -exec rm -f {} \;
find $dir -atime +7 -name "*log*" -exec rm -f {} \;
}
clean_log appa
clean_log appb
...
#!/bin/bash
#可以tree到某一目录下所有的tomcat目录,新增或删减tomcat无需修改脚本文件,筛选条件需严格指定
home_path=/home/tomcat
all_dir=$(tree -Lf 2 ${home_path} | grep -E -v "logs|tar|dmp|bak|./jjdt|nx$|ah$|sz$|\.$|^$|tomcat$|directories" | awk '{print $NF}')
clean_log () {
dir=$1/logs
find $dir -atime +7 -exec rm -f {} \;
}
logs_ls () {
#dir=/home/tomcat/$1/logs
sum=`ls $1/logs | wc -l`
echo "$1 logfile count is [${sum}]"
}
#list_tomcat=('flow' 'sso' 'utr' 'uc' 'bid' 'portal-xm' 'sso-xm' 'bid-xm' 'cms-xm' 'flow-xm' 'uc-xm' 'utr-xm' 'utrj-xm' 'portal')
for i in ${all_dir};
do
clean_log $i
logs_ls $i
#echo $i
done
(多个不同应用)
#!/bin/bash
date1=$(date -d -1days +%Y-%m-%d-%H_%M)
app=('apache' 'tomcat1' 'tomcat2')
for i in ${app[@]}
do
case $i in
apache)
dir=/usr/local/httpd/logs
cd $dir
cp mod_jk.log mod_jk.$date1
echo '' > mod_jk.log
tar -zcvf mod_jk.$date1.tar.gz mod_jk.$date1
rm -f mod_jk.$date1
#删除30天之前的文件
find $dir -atime +30 -exec rm -f {} \;
;;
*)
dir=/home/sso/$i/logs
cd $dir
cp catalina.out catalina.$date1
echo '' > catalina.out
tar -zcvf catalina.$date1.tar.gz catalina.$date1
rm -f catalina.$date1
#删除30天之前的文件
find $dir -atime +30 -exec rm -f {} \;
#删除7天之前的log文件
find $dir -atime +7 -name "*log*" -exec rm -f {} \;
;;
esac
done
#!/bin/bash
#00 00 * * * scriptname
#将昨天的日志打包,传输给备份机,本地保留14个月的历史备份
date1=$(date -d -1days '+%F_%T')
date2=$(date -d -1days '+%F')
bakPath=/home/nfcq/Logback
scpAddress=192.168.100.118
scpUsername=nq
logType2=catalina.out
logType3=catalina.${date1}.out
logType3_1=catalina.${date1}.out.tar.gz
logType4=catalina.${date2}.log
logType5=host-manager.${date2}.log
logType6=localhost.${date2}.log
logType7=manager.${date2}.log
logTypeflow=flow.log.${date2}
logTypeportal=zbxsoft-portal.log.${date2}
logTypesso=passport.log.${date2}
logTypeuct=zbxsoft.log.${date2}
logTypeutrm=utrs.log.${date2}
logTypeutrj_web=utrs.log.${date2}
apacheCleanLog (){
logDir=/home/apache2/logs
scpBack=${bakPath}/${web_id}
apacheLog=(error_log mod_jk.${date2}.log pbid.csuaee.com.cn-access${date2}.log sso.csuaee.com.cn-access${date2}.log xx.csuaee.com.cn-access${date2}.log jjdt.csuaee.com.cn-access${date2}.log utrj.csuaee.com.cn-access${date2}.log)
cd ${logDir}
for i in ${apacheLog[@]}
do
logType_apache=${i}.tar.gz
tar -zcf ${logType_apache} ${i} --remove-files
scp ${logType_apache} ${scpUsername}@${scpAddress}:${scpBack} 2>/dev/null
done
find ${logDir} -mtime +434 -exec rm -f {} \;
}
cleanLog (){
app_id=${1}
[[ -n ${app_id} ]] || exit;
logDir=/home/nfcq/utrs/tomcat-${app_id}/logs
export scpBack=${bakPath}/${app_id}
cd $logDir
cp ${logType2} ${logType3}
# echo '' > ${logType2}
tar -Pzcf ${logType3_1} ${logType3} --force-local --remove-files
#scp logfile
scpLog
#cleal logs 434 days(14 months) ago
find $logDir -mtime +434 -exec rm -f {} \;
}
scpLog (){
newLogType=logType${app_id}
newLogType=$(eval echo '$'$newLogType)
cd $logDir && if stat ${newLogType} >/dev/null 2>&1;then :;else mv "${newLogType} " ${newLogType};fi
logtype=(${logType3_1} ${logType4} ${logType5} ${logType6} ${logType7} ${newLogType})
for i in ${logtype[@]}
do
scp ${logDir}/${i} ${scpUsername}@${scpAddress}:${scpBack} 2>/dev/null
done
[[ ${app_id} == "utrj_web" ]] && scp ${logDir}/cmrsInfo.log.${date2} ${scpUsername}@${scpAddress}:${scpBack} 2>/dev/null
}
cleanLog flow
cleanLog portal
cleanLog sso
cleanLog uct
cleanLog utrm
cleanLog utrj_web
#apacheCleanLog
#!/bin/bash
# 定时处理
# 大小处理
# oss
# 处理后压缩删源
# 假设任务每5分钟执行一次,脚步开始运行,处理一次日志不退出,内部循环每10s一次,判断日志大小,脚步运行到290s时,kill掉自己,等待定时任务下次执行
# 获取主机名
host_name=$(hostname)
# 定义docker数据目录
docker_var_path=/var/lib/docker
# 定义docker日志目录
docker_log_path=containers
# 定义docker日志缓存目录
docker_log_temp_path=docker_log_dir
# 定义时间戳_2020-02-06_13-39-13
log_tar_timestamp=$(date +%F_%H-%M-%S)
# 定义日志操作类型,time为每次执行脚本时执行(crontab),size为脚本内循环执行
type=time
# 定义日志处理方法
log_rodate(){
# 查出当前的容器数
container_list=$(ls ${docker_log_path})
# 截取容器ID前12位和docker container ls校验,拿到容器名
for container in ${container_list[@]};do
container_log_name=${docker_log_path}/${container}/${container}-json.log
container_sid=${container:0:12}
container_name=$(docker container ls --filter id=${container_sid} --format '{{.Names}}')
if [[ ${type} == "time" ]];then
# 获取日志文件行数,文件判空处理
if test -s ${container_log_name}; then
container_log_line=$(wc -l ${container_log_name} | awk '{print $1}')
else
continue
fi
elif [[ ${type} == "size" ]];then
## 判断日志大小,处理日志
container_log_size=$(ls -l ${container_log_name} | awk '{print $5}')
# 文件大于5M
if [[ 5000000 -le ${container_log_size} ]]; then
container_log_line=$(wc -l ${container_log_name} | awk '{print $1}')
else
continue
fi
fi
# 将总行数之前的日志输出到待处理日志文件中(保证输出过程中新日志的保留),删除刚刚的总行数,保留新产生的日志
mkdir -p ${docker_log_temp_path}
# sed的方式会改变文件的Inode,导致服务需要重启才能往文件里写日志
# sed -n "1,${container_log_line}p" ${container_log_name} >> ${docker_log_temp_path}/${container_name}_${log_tar_timestamp}-json.log
# sed -i "1,${container_log_line}d" ${container_log_name}
# cat的方式可能会丢失cat和echo之间的日志
cat ${container_log_name} >> ${docker_log_temp_path}/${container_name}_${log_tar_timestamp}-json.log
echo -n "" > ${container_log_name}
# 拼装日志归档名称,将待处理日志文件归档,删除源文件
tar -zcf ${docker_log_temp_path}/${container_name}_${log_tar_timestamp}.tar.gz ${docker_log_temp_path}/${container_name}_${log_tar_timestamp}-json.log --remove-files
done
}
## 切换到数据目录
cd ${docker_var_path}
log_rodate
## 循环开始
#日志类型切换为按size切割
type=size
num=0
while((num < 29));
do
## 睡眠时间
sleep 10
log_rodate
## 自增数
let num=${num}+1
done
## 拼装oss文件名,上传oss
cd /tmp
tar -zcf ${host_name}_docker_log_${log_tar_timestamp}.tar.gz ${docker_log_temp_path}/*${log_tar_timestamp}.tar.gz --remove-files
yes | aliyun oss cp ${host_name}_docker_log_${log_tar_timestamp}.tar.gz oss://data-dump/
网友评论