转至:https://mp.weixin.qq.com/s/ELR7GhjtkrwtPwsJxcV5ZA
随着维护的机器约来越多,主机资源约来越紧张,特别是存储方面的管理,如何释放释放空间,节约成本就尤为重要。而应用日志是首当其冲占用存储较大的一部分,如何对其处理就变成了日常运维难以避免的事。
本文就如何通过统一对日志进行管理,当然,从运维的角度,需要做到日志的统一管理,通过配置化形式实现一个脚本复用所有机器,从而降低日常维护工作量,解决成本。
接下来的脚本,主要包含:
(1)主体脚本,主要功能是对日志的压缩和清理;
(2)配置信息,通过配置日志文件、清理路径和保留时间实现统一配置;
(3)定时任务,通过设置执行时间实现定时执行;
首先,介绍下主体脚本,该脚本实现了对日志的压缩和清理,通过脚本中两个for循环实现了批量进行日志的压缩和清理,无需多个文件重复执行命令处理。该脚本编写好后无需再进行编辑,如果需要新增或者删除备操作对象,只需修改配置信息文件即可。
#/bin/sh
. $HOME/.bash_profile
#获取昨天的日期三种方法:
Yesterday=`date +"%Y%m%d" -d "-1 days"`
#Yesterday=`date -d last-day '+%Y%m%d'`
#Yesterday=`date -d 'yesterday' '+%Y%m%d'`
###############################################################
# 以下的处理脚本针对昨天的日志进行压缩
# 日志文件的日期格式如下:
# application.log.20190710
# 如果需要压缩更早的日志,可以对$Yesterday进行相应的更改
###############################################################
# 日志压缩部分开始,“files.conf”为配置信息文件
for file in $(cat $HOME/shell/files.conf|grep "gzfile=" |awk -F "=" '{print $2}')
do
#当前时间
nowtime=`date "+%Y-%m-%d %H:%M:%S"`
echo "时间:${nowtime},开始对"${file}"."${Yesterday}"开始进行压缩..."
gzip $file"."$Yesterday
done
# 日志压缩部分结束
# 日志清理部分开始
for dir in $(cat $HOME/shell/files.conf|grep "cleardir=" |awk -F "=" '{print $2}')
do
#当前时间
nowtime=`date "+%Y-%m-%d %H:%M:%S"`
echo "时间:${nowtime},开始对"${dir}"目录下的日志进行清理..."
find $dir -name "*.log.*" -type f -ctime +$(grep "cleartime=" $HOME/shell/files.conf |awk -F "=" '{print $2}') -exec rm -f {} \;
done
# 日志清理部分结束
上述脚本需要注意一点,压缩的是昨天的日志文件,日志需要进行按天分割,一般程序会自动分割,如java程序的log4j配置后每天都会将昨天的日志添加时间戳进行分割。如果时间戳的格式和脚本不一样,需要修改脚本的"Yesterday"变量,如果想保留多几天的日志不被压缩,同样只需要修改"Yesterday"变量。
接下来介绍下配置信息,配置文件内容如下,我们暂且取名为“files.conf”,该文件涉及需要压缩文件的全路径、需要清理目录路径以及日志保留天数。
# 需要压缩的日志放在gzfile后面gzfile=/home/liyx/logs/application.loggzfile=/home/liyx/domains/console.log# 需要清理的日志目录放在cleardir后面cleardir=/home/liyx/logscleardir=/home/liyx/domains# 日志保留天数cleartime=30
最后将该脚本和配置信息文件放到需要清理的机器上即可,根据清理需要配置定时任务,此处给出定时任务样例,每天凌晨1点执行定时任务:
# 日志压缩清理00 01 * * * sh /home/liyx/shell/gzip_and_del.sh >> /home/liyx/shell/gzip_and_del.log
附:
日常工作中会遇到对时间的处理,这里提供获取昨天时间的脚本供参考。
V_month=`date +%m`
v_day=`date +%d`
v_min=`date +%M`
v_hour=`date +%H`
sysdate1=`date +%Y%m%d`
sysdate2=`date +%Y%m%d%H%M`
if [ $v_day -eq "01" -a $v_hour -eq "0" -a $v_min -le "30" ];
then
ymoth1=$($(date +%Y%m)-1)
if [ $v_month -eq "1" ];
then
ymoth1=$($(date +%Y)-1)12
fi
else
ymoth1=`date +%Y%m`
fi
if [ $v_day -eq "01" ];
then
ymoth=$($(date +%Y%m)-1)
if [ $v_month -eq "1" ];
then
ymoth=$($(date +%Y)-1)12
fi
else
ymoth=`date +%Y%m`
fi
#echo $ymoth $ymoth1
yy=`date +%Y` #Year yyyy
mm=`date +%m` #Month mm
dd=`date +%d` #Day dd
#echo $yy $dd $mm
if [ $dd = "01" ]
then
lm=`expr $mm - 1 `
if [ $lm -eq 0 ]
then
lm=12
yy=`expr $yy - 1 `
fi
#echo lm=$lm
case $lm in
1|3|5|7|8|10|12) Yesterday=31 ;;
4|6|9|11) Yesterday=30 ;;
2)
if [ ` expr $yy % 4 ` -eq 0 -a `expr $yy % 100 ` -ne 0 -o ` expr $yy % 400 ` -eq 0 ]
then Yesterday=29
else Yesterday=28
fi ;;
esac
mm=$lm
else Yesterday=`expr $dd - 1 `
fi
case $Yesterday
in 1|2|3|4|5|6|7|8|9) Yesterday='0'$Yesterday
esac
case $mm in 1|2|3|4|5|6|7|8|9) mm='0'$mm ;;
esac
yesterday=$yy-$mm-$Yesterday
Yesterday=$yy$mm$Yesterday