自动清除过期的Tomcat日志的shell脚本

(友好提示:本文属于初级shell编程,高手可忽略此文)

在产品环境运行过程中,每天会切割产生按天计的日志文件,这些日志文件一般在过一定期限以后就没什么用处了,因此需要定期删除掉这些过期的日志文件。本文以CentOS下的Tomcat为应用环境基础,通过shell脚本的方式定时自动删除过期的Tomcat日志文件,以减少磁盘空间的占用、减轻管理员的日常工作。

一、shell脚本代码:

#!/bin/bash
#
# filename: clearExpiredTomcatLogs.sh
#
# FUNCTION: clear the expired tomcat log files
#
# -----------------增加 crontab 定时任务
# Add sys schedule:
#     crontab -e
# press "i" enter the Modify mode, and add schedule item in new-line:
# 05 00 * * * /bin/bash /products/dds/clearExpiredTomcatLogs.sh
# press "Esc" key to exit Modify mode, then press "Shift + :" and input "wq", press "Enter" key to exit the crontab
# -----------------

# the base directory for search the existed apache tomcat. 配置包含tomcat目录的路径,该目录或其子孙目录下存在Tomcat目录
SEARCH_DIR=/products/dds/

# the keep days of log-files.[config value range: 2 -- 365] 配置日志保留天数
KEEP_LOGFILE_DAYS=31

# execute log for this shell 配置本脚本的执行日志文件
EXECUTE_LOG_FILE=${SEARCH_DIR}clear-expired-tomcat-logs.log

##
# write execute log 写日志信息到本脚本的执行日志文件中
writelog() {
    if [ ! -f "${EXECUTE_LOG_FILE}" ]; then
        touch ${EXECUTE_LOG_FILE}
    fi
    echo "$1">>${EXECUTE_LOG_FILE}
}

##
# remove expired log files 移除过期的日志文件(此方法为被调用方法);可根据实际需要 在删除前 增加日志备份功能
removeExpiredLogFiles() {
    log_dir=$1
    log_file_prefix_name=$2
    log_file_ext_name=$3

    REMOVED_FILE=1

    LOG_FILE=
    LOG_FILE_NAME=
    CUR_DATE=
    for((i=${KEEP_LOGFILE_DAYS};i<=365;i++));do
        CUR_DATE=$(date +"%Y-%m-%d" --date="-$i day")
        LOG_FILE_NAME=${log_file_prefix_name}${CUR_DATE}${log_file_ext_name}
        LOG_FILE="${log_dir}/${LOG_FILE_NAME}"
        if [ -f "${LOG_FILE}" ]; then
            writelog "        ${LOG_FILE_NAME}"
            rm -f ${LOG_FILE}
            REMOVED_FILE=0
        fi
    done

    if [ ${REMOVED_FILE} -eq 0 ]; then
        writelog ""
    fi

    unset -v log_file_prefix_name log_file_ext_name
    unset -v LOG_FILE LOG_FILE_NAME CUR_DATE

    return ${REMOVED_FILE}
}

##
# remove the tomcat‘s log files 移除过期的tomcat的日志文件(此方法为被调用方法);如有其他日志文件可增加删除条目
removeExpiredLogFilesForTomcat() {
    log_dir=$1

    # remove log-files that which is out of the keep days.
    removeExpiredLogFiles "${log_dir}" "catalina." ".log"
    a=$?

    removeExpiredLogFiles "${log_dir}" "catalina." ".out"
    b=$?

    removeExpiredLogFiles "${log_dir}" "host-manager." ".log"
    c=$?

    removeExpiredLogFiles "${log_dir}" "manager." ".log"
    d=$?

    removeExpiredLogFiles "${log_dir}" "localhost." ".log"
    e=$?

    if [ ${a} -eq 1 -a ${a} -eq ${b} -a ${a} -eq ${c} -a ${a} -eq ${d} -a ${a} -eq ${e} ]; then
        writelog "        # No expired log file"
        writelog ""
    fi

    unset -v log_dir
}

writelog "#-------------------------------------------------START"
writelog "`date +"%Y-%m-%d %A %H:%M:%S"`"
writelog "keep days for tomcat log files: $KEEP_LOGFILE_DAYS"
writelog "remove the expired tomcat log files in the following directories:"

##
# find the apache-tomcat and remove the expired log files 循环“查找匹配到 apache-tomcat 字样的目录和文件”
for t in `find $SEARCH_DIR -name ‘*apache-tomcat-*‘`
do
    # 判断是否为目录
    if [ -d "${t}/logs" ]; then
        writelog "    ${t}/logs/"
        removeExpiredLogFilesForTomcat "${t}/logs"
    fi
done

writelog "#-------------------------------------------------END"
writelog ""

unset -v SEARCH_DIR KEEP_LOGFILE_DAYS EXECUTE_LOG_FILE
unset -f writelog removeExpiredLogFiles removeExpiredLogFilesForTomcat

二、shell脚本的执行

可按照脚本内容中“增加 crontab 定时任务”的描述增加为系统的定时任务;也可直接在命令行窗口中直接运行,如: sh clearExpiredTomcatLogs.sh  或者 在授予可执行权限 (chmod +x clearExpiredTomcatLogs.sh) 后执行 ./clearExpiredTomcatLogs.sh

三、特别说明

shell脚本中应尽量保持没有中文字符,以避免产生莫名问题。以上shell脚本中的中文仅为了解释相关内容,实际使用的脚本中是没有相关内容的。

以上shell脚本应该是比较简单的,shell高手可忽略此文,或者提出改进建议或意见。

时间: 2024-11-11 02:12:46

自动清除过期的Tomcat日志的shell脚本的相关文章

tomcat 日志切割shell脚本

vim tomcat_cut.sh #!/bin/bash log_path=/opt/tomcat8080/logs d=`date +%Y-%m-%d` d4=`date -d'30 day ago' +%Y-%m-%d` cd ${log_path} && cp catalina.out $log_path/catalina.out.$d.log echo > catalina.out rm -rf $log_path/catalina.out.${d4}.log # chmo

自动发送密码抓取远程日志用Shell脚本如何实现?

在linux系统中,如何用shell脚本抓取远程日志?分析线上的日志会有一个困境,机器太多,如果每台都登录上去看不太现实,但是下载下来更麻烦因为每台SCP都要求输入密码.于是我便写了一个自动抓取远程日志的脚本,实现在基本功能. 代码: #!/usr/bin/expect -f if { $argc !=1 && $argc !=2 } {send_user "没有输入远程日志文件名.\n"send_user "格式是:get.sh ${remote_log}

nginx日志切割shell脚本

#!/bin/bash #function:cut nginx log files shell #cp /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access.log.bak log_cut_path="/var/log/nginx" log_files_path="/usr/local/nginx/logs/" log_files_dir=${log_cut_path}$(date -d &quo

Dockerfile 构建后端tomcat应用并用shell脚本实现jenkins自动构建

Dockerfile 文件构建docker镜像 FROM centos MAINTAINER zhaoweifeng "zh******tech.cn" ENV LANG en_US.UTF-8 RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone WORKDIR /home RUN mkdir JDK COPY jdk

如何从windows平台自动连接到Linux/Mac机运行shell脚本?

不算什么新知识了,但是对于像我这样的小白来说,如果一早就能找到一篇这样从实战中总结出来的心得,就不会今天忙得只喝两杯水了(好吧,胆大心细脸皮厚是我的人生座右铭╭(╯^╰)╮) 背景: 某项目要求从性能测试工具LoadRunner中模拟并发用户调用位于一台mac虚拟机上的shell脚本. putty 批量关机  http://alwaysyunwei.blog.51cto.com/3224143/1223455/ 方法一:Plink windows bat(通用方法) 这个方法的原理是通过wind

Tomcat灰度发布shell脚本(来自网络可以参考)

java灰度脚本 使用脚本注意事项:1. 发布机器需要能够解析web服务器主机名,并且配置ssh通信2. 变量中的目录以及用户等信息需要自己创建,脚本没有做判断自己创建.我这里web服务器是使用ansible进行部署的,相关目录和用户都会自动创建.3.代码的部署使用tag,但是代码的更新使用软连接来控制,回滚则切换到上一个软连接4.由于java是编译型语言,我们使用maven来进行编译,所以需要安装maven环境.5.关于环境配置文件:配置文件为自己手动维护,每次都是删除git仓库拉取下来的配置

Tomcat 日志清理小脚本

#查看磁盘的大小和输出格式: $ df -h Filesystem      Size  Used Avail Use% Mounted on /dev/vda1        20G  5.8G   13G  31% / tmpfs           1.9G     0  1.9G   0% /dev/shm /dev/vdb         40G   12G   26G  32% /data #截取/data目录使用磁盘大小的百分比 $ max=`df -h |awk 'NR==4''

快速部署tomcat项目的Shell脚本

为了做集群测试,在每台机器上装了3个tomcat,每次发布项目的时候都要反复敲一些命令,重启tomcat之前先检查tomcat进程有没有停掉,没有还要手动kill该进程. 发布次数多了,操作就比较繁琐了,索性写个脚本一键发布,省时省力^_^. 把deploy.sh和restart.sh分别拷贝到3个tomcat的bin目录下,再用chmod +x给这两个脚本赋上可执行权限. 一键发布命令:./deploy.sh 项目war包    例如:./deploy.sh /home/test.war 说明

处理nginx站点日志的shell脚本

nginx站点中access和error使用的都是默认的日志格式,日志文件命名如下: www.xxxx.com.access.log www.xxxx.com.error.log 脚本每天处理前一天的日志记录,将日志重新放在压缩文件中,并按月份存放,如下: 201611/www.xxxx.com.access.20161102.log.zip 201611/www.xxxx.com.error.20161102.log.zip 脚本如下: #!/bin/bash # Description: d