#!/usr/bin/env bash # shellcheck disable=SC2086 # # archive catalina.out # # SPDX-License-Identifier: MIT ## SETTINGS MUST BE CHANGED TO USE THIS SCRIPT ## # This script will operate on the already rotated catalina.out logfiles # generated by the changing catalina.sh to use a piped logging method # such as: # # org.apache.catalina.startup.Bootstrap "$@" start \ # |/usr/bin/rotatelogs "$CATALINA_BASE"/logs/catalina.out.%Y%m%d-%H%M 200M >> /dev/null 2>&1 & # Run this from crontab nightly at an off hour, # as gzip can suck up some serious CPU on huge logs: # 0 2 * * * /opt/sbin/archivecatalina.sh ########## SETTINGS BEGIN ########## # ARCHIVE_METHOD settings # 0 = unset (default) # 1 = compress in place # 2 = move to another location # 3 = compress and move ARCHIVE_METHOD=0 # DURATION_KEEP setting # = number of days prior to keep around DURATION_KEEP=28 # CATALINA_LOGS setting # path to source catalina.out.* files CATALINA_LOGS=/usr/local/tomcat/logs # CATALINA_ARCH setting # path to store older logs based on ARCHIVE_METHOD=2 or 3 # NOTE: this directory is NOT autocleaned on purpose!! CATALINA_ARCH=/mnt/server/arclogs # DURATION_WORK setting # = number of days prior to start working (default 1 day) DURATION_WORK=1 ########## SETTINGS END ########## # What's our log name LOG_BASE="catalina.out" # Errorlevels ERR_ERROR=33 ERR_PANIC=66 # Default RedHat program locations MV=/bin/mv DT=/bin/date RM=/bin/rm ID=/usr/bin/id GZ=/usr/bin/gzip # Are we root? USER=$($ID -u) if [ "X$USER" != "X0" ]; then echo "PANIC: Only root can run this script!" exit $ERR_PANIC fi # Sanity checks if [ $ARCHIVE_METHOD -eq 0 ]; then echo "PANIC: ARCHIVE_METHOD is set to 0, please configure the script." exit $ERR_PANIC fi if [ $DURATION_WORK -lt 1 ]; then echo "PANIC: DURATION_WORK is set to less than one day." exit $ERR_PANIC fi if [ $DURATION_KEEP -le $DURATION_WORK ]; then echo "PANIC: DURATION_KEEP is less than or equal to DURATION_WORK." exit $ERR_PANIC fi # Does the source path exist? if [ ! -x "$CATALINA_LOGS" ]; then echo "ERROR: $CATALINA_LOGS doesn't exist!" exit $ERR_ERROR fi # Backup dir exists/writable? if [ $ARCHIVE_METHOD -eq 2 ] || [ $ARCHIVE_METHOD -eq 3 ]; then if [ ! -x "$CATALINA_ARCH" ]; then echo "ERROR: $CATALINA_ARCH doesn't exist or isn't writable!" exit $ERR_ERROR fi fi # generate fromat stamps DATE_WORK=$($DT --date "now - $DURATION_WORK days" +"%Y%m%d") DATE_KEEP=$($DT --date "now - $DURATION_KEEP days" +"%Y%m%d") # log actions below depends on formatting looking like: # /some/path/catalina.out.20100520-1345 (YYYYMMDD-HHMM) # (.gz is accounted for) # ARCHIVE_METHOD=1 compress_keep (){ for logfile in "$CATALINA_LOGS/$LOG_BASE."*; do # if it ends in gz it's already compressed if [ "${logfile:(-3):3}" == ".gz" ]; then continue else # grab the %Y%m%d out of the name DTS=${logfile:(-13):8} if [ $DTS -ge $DATE_KEEP ] && [ $DTS -le $DATE_WORK ]; then # compress in place $GZ "$logfile" fi fi done } # ARCHIVE_METHOD=2 move_only (){ for logfile in "$CATALINA_LOGS/$LOG_BASE."*; do # strip off .gz, we don't care if it's compressed logtemp=${logfile%.gz} DTS=${logtemp:(-13):8} if [ $DTS -ge $DATE_KEEP ] && [ $DTS -le $DATE_WORK ]; then $MV -f "$logfile" "$CATALINA_ARCH/" fi done } # ARCHIVE_METHOD=3 compress_move (){ for logfile in "$CATALINA_LOGS/$LOG_BASE."*; do logtemp=${logfile%.gz} DTS=${logtemp:(-13):8} if [ $DTS -ge $DATE_KEEP ] && [ $DTS -le $DATE_WORK ]; then # already compressed if [ ${logfile:(-3):3} == ".gz" ]; then $MV -f "$logfile" "$CATALINA_ARCH/" else $GZ -c "$logfile" >> "$CATALINA_ARCH/$logfile.gz" $RM -f "$logfile" fi fi done } # cleanup older than DURATION_KEEP cleanup_older (){ for logfile in "$CATALINA_LOGS/$LOG_BASE."*; do logtemp=${logfile%.gz} DTS=${logtemp:(-13):8} if [ $DTS -lt $DATE_KEEP ]; then $RM -f "$logfile" fi done } # the main case case $ARCHIVE_METHOD in 1) compress_keep ;; 2) move_only ;; 3) compress_move ;; *) echo "PANIC: Invalid ARCHIVE_METHOD settting: $ARCHIVE_METHOD" exit $ERR_PANIC esac # do a final cleanup cleanup_older exit 0