24-Dec-85 06:28:33-MST,4388;000000000001
Return-Path: <[email protected]>
Received: from BRL-TGR.ARPA by SIMTEL20.ARPA with TCP; Tue 24 Dec 85 06:28:24-MST
Received: from usenet by TGR.BRL.ARPA id a022731; 24 Dec 85 7:45 EST
From: [email protected]
Newsgroups: mod.sources
Subject: agelog - trim log files
Message-ID: <[email protected]>
Date: 23 Dec 85 16:39:28 GMT
Sender: [email protected]
Approved: [email protected]
To:       [email protected]

Mod.sources:  Volume 3, Issue 66
Submitted by: ucbvax!hpda!hpdsa!davel (Dave Lennert)


The agelog script performs a simple, yet critical function in
system maintenance.  Many log files in unix will grow without bound.
A common practice is to periodically clear a log file's contents
when it has grown large enough to gobble too much disk space.  This
unfortunately loses all your recent log history.  Agelog strikes
a happy medium by automatically (via cron(1)) trimming log files
while retaining recent information.  An explanation of its usage is
given in the comments at the front of the script along with examples
for a couple common unix log files.  Note that by controlling how many
history files are maintained and how often the trimming is done one
has control over how much information is lost during each agelog.

This is an enhanced version of the `syslogswap' script shown in Wizard's
Grabbag in the January 1986 Unix/World; it supports an optional
directory where the archived log files are stashed.

The original script is by Dave Lennert.  The enhancements are by
Bob Designer.  Both of Hewlett-Packard.

   Dave Lennert                ihnp4!hplabs!hpda!davel         [UUCP]
   Bob Designer                ihnp4!hplabs!hpda!bd            [UUCP]

   Hewlett-Packard - 47UX
   19447 Pruneridge Ave.
   Cupertino, CA  95014

---------cut here--------------------------------------
#! /bin/sh
: agelog -- age log files, by Dave Lennert as told to Bob Desinger
#
# Usage:  $0 logFile howMany [stashDir]
# The most recent <howMany> logs are kept around by renaming logFile to
# logFile.0, after similarly rolling logFile.0 => logFile.1 => logFile.2 => ...
# If <stashDir> is named, the old logs will be kept in that directory.  If not
# given, the old logs are left in the same directory as the original logFile.
#
# Example:
# `agelog /usr/adm/sulog 2' will, if run weekly, keep 3 files around:
#       /usr/adm/sulog    containing this week's log info
#       /usr/adm/sulog.0  containing last week's log info
#       /usr/adm/sulog.1  containing the week before last's log info
#
# A typical crontab entry:
# #     Keep the most recent 2 weeks worth of uucp logs around in
# #     /tmp/Oldlogs/*, one per day, so that old LOGFILEs will be in
# #     /tmp/Oldlogs/LOGFILE.{0,1,2,...}
# 00 1 * * * /usr/local/agelog /usr/spool/uucp/LOGFILE 14 /tmp/Oldlogs


# Initialize:

PATH=/usr/ucb:/usr/bin:/bin:/etc:/usr/lib  # BSD systems have /usr/ucb
export PATH

# traps:  0=exit  1=hangup  2=interrupt  3=quit  15=terminate
trap 'echo 1>&2 "$0: Ow!"; exit 15' 1 2 3 15


# Digest arguments:

if [ $# -lt 2 -o $# -gt 3 ]
then    # we can use only 2 args or 3 args
       echo 1>&2 "Usage:  $0 logFileName howMany [stashDir]"
       exit 1
else
       log="$1"        # logFileName
       max="$2"        # howMany
       if [ -z "$3" ]
       then    # no directory to stash them in; use log's directory
               head=`expr $log : '\(.*/\).*'`  # /a/b/x => /a/b/
       else    # user specified a directory
               if [ ! -d "$3" ]
               then
                       echo 1>&2 "$0: $3 is not a directory"
                       exit 2
               else
                       head="$3/"
               fi
       fi
fi


# Rename log.$max-1 => ... => log.3 => log.2 => log.1

arch="${head}`basename $log`"   # name of archive files, sans {.0, .1, ...}

older=`expr $max - 1`   # ensure we had a number in $2
if [ $? -eq 2 ]
then    # not a number, or some problem
       echo 1>&2 "$0: cannot decrement $max"
       exit 2
fi

while [ $older -gt 0 ]
do      # age the logfiles in the stashdir
       old=`expr $older - 1`
       if [ -f $arch.$old ]
       then
               mv $arch.$old $arch.$older
       fi
       older=`expr $older - 1`
done


# Old logfiles are all rolled over; now move the current log to log.0

# Use cp instead of mv to retain owner & permissions for the original file,
# and to avoid prematurely aging any info going into the file right now.
if [ -f $log ]
then
       # don't create an old log if $2 was 0
       test $max -gt 0 && cp $log $arch.0
       cp /dev/null $log       # clear out log
fi

exit 0