转至: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"."$Yesterdaydone# 日志压缩部分结束# 日志清理部分开始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)12fielse ymoth1=`date +%Y%m`fiif [ $v_day -eq "01" ];thenymoth=$($(date +%Y%m)-1)if [ $v_month -eq "1" ];thenymoth=$($(date +%Y)-1)12fielseymoth=`date +%Y%m`fi#echo $ymoth $ymoth1yy=`date +%Y` #Year yyyymm=`date +%m` #Month mmdd=`date +%d` #Day dd#echo $yy $dd $mmif [ $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 ` ficase $Yesterday in 1|2|3|4|5|6|7|8|9) Yesterday='0'$Yesterday esaccase $mm in 1|2|3|4|5|6|7|8|9) mm='0'$mm ;;esacyesterday=$yy-$mm-$YesterdayYesterday=$yy$mm$Yesterday