Hello,

I have written a script to rotate the event-log, preserving the previous
period's log entries.
Therefore, the statistics are never empty after log rotation.

It can also be used to rotate the edit-log every 3 months.

FYI, I have stressed it. It can "lose" 1 log line if you have more that
20 hits per seconds. (ie. about 70000 hits per hour !)

Comments are welcome.
[I know, it's NTRWTSTP: Not the right way to solve the problem. But I
want a solution for moin 1.7, not a patch for 1.9]

Franklin

#!/bin/sh
#
# rotate-and-keep.sh - Rotate a log file, keeping the last period.

#     This script is useful when you want to rotate a file 
#     periodically, but you want the "current" log file to always
#     contain two periods. (sometime needed for statistics)

#  Copyright 2009 Franklin Piat <URL:http://www.klabs.be/~fpiat/>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

version=0.1

# LIMITATION
#
# Unique lines only
#    Use this script on logfiles that don't produce duplicate line
#    (i.e Each line MUST contain date and time, at least)
#
# Disk Space
#    The partition must have free space to make a copy of the last logfile
# 
#  ,--[ KNOWN BUG / DISCLAIMER ]------------------------------------------.
#  |                                                                      |
#  |  The traditional way to rotate a log file is to move it. Which is    |
#  |  guaranteed to be atomic and immediate.                              |
#  |                                                                      |
#  |  ** THIS SCRIPT ISN'T ATOMIC AND ISN'T IMMEDIATE **                  |
#  |  You may lose some new lines, appended while the rotation occurs.    |
#  |  (because it has to copy and manipulate the log file. Typically if   |
#  |  you have more than 10 lines of log per seconds... that is > 100000  |
#  |  page hit per day!)                                                  |
#  `----------------------------------------------------------------------'


LOGFILE=event-log
ARCHIVE=event-log.$(date +%F_%T)
TMPFILE=event-log.tmp
LASTLINE=lastline


set -e
pivotline=0
if [ -s "$LASTLINE" -a -s "$LOGFILE" ]; then
        pivotline=$(grep  -s -n -F -f $LASTLINE $LOGFILE | tail -n 1 | cut -d 
":" -f 1)
        #DEBUG: printf "Rotate line #$pivotline: " >&2 ; cat "$LASTLINE" > &2
fi

if [ "$pivotline" -gt 1 ] ; then
        pivotline=$(( $pivotline + 1 ))
        mv "$LOGFILE" "$TMPFILE"

        if sed -n $pivotline,\$p "$TMPFILE" > "$ARCHIVE" ; then
                cp "$ARCHIVE" "$TMPFILE" 
                ## TEST: for test purpose, you can insert a sleep here to
                ##       simulate the copy of large log file.
                #sleep 1

                # Try to catch new lines (that occured during the "cp" above)
                if [ -s "$LOGFILE" ]; then
                         cat "$LOGFILE" 2>/dev/null | tee -a "$ARCHIVE" >> 
"$TMPFILE"
                fi

                mv "$TMPFILE" "$LOGFILE"
                tail -n 1 "$ARCHIVE" > "$LASTLINE"
        else
                #Restore the logfile in case of error (especially disk-space!)
                echo "LOG ROTATION ABORTED: probably insufficient disk-space." 
>&2
                mv "$TMPFILE" "$LOGFILE"
                exit 1
        fi
else
        if [ -s "$LOGFILE" ]; then
                cp "$LOGFILE" "$ARCHIVE"
                tail -n 1 "$ARCHIVE" > "$LASTLINE"
        else
                cp /dev/null "$LASTLINE"
        fi
fi
#
# To test/stress this script you can generate a fake log using
# while true; do date +%s.%N | tee -a event-log >> log; sleep 0.01 ; done


------------------------------------------------------------------------------
The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your
production scanning environment may not be a perfect world - but thanks to
Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700
Series Scanner you'll get full speed at 300 dpi even with all image 
processing features enabled. http://p.sf.net/sfu/kodak-com
_______________________________________________
Moin-user mailing list
Moin-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/moin-user

Reply via email to