blob: 1c1ced0d461af6d662450bf38e961bc173254683 [file] [log] [blame]
#!/bin/bash
#
# Copyright 2011 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Rotate the logs in the apache logs directory specified on the command line,
# and gzip them, then erase old logs if disk usage is over 85%. Note that
# apache must be stopped when we do this. Note also that we take pains not to
# erase the newly-rotated logs, as those are the ones we are likely to care
# deeply about. This may mean the disk stays full, but logs are pretty
# compressible so it's unlikely.
set -e
now() {
date '+%Y%m%d-%H%M'
}
stamp=$(now)
if [ $# -ne 1 -o ! -d "$1" ]; then
echo "Usage: apache_rotate_logs.sh logs_directory" >&2
exit 1
fi
cd "$1"
if [ -f "error_log.gz" ]; then
# Clean up after partial log rotation
echo "Cleaning up error_log.gz"
mv error_log.gz error_log.$stamp.gz
cleaned_up=true
fi
if [ -f "access_log.gz" ]; then
# Clean up after partial log rotation
echo "Cleaning up access_log.gz"
mv access_log.gz access_log.$stamp.gz
cleaned_up=true
fi
if [ ! -f "error_log" -a ! -f "access_log" ]; then
# No logs to rotate.
echo "No new logs to rotate"
else
# gzip can be kind of slow, so parallelize.
# But gzip well, as this stuff eats a ton of space.
if [ -f "error_log" ]; then
echo "Gzipping error_log"
gzip -9 error_log &
fi
if [ -f "access_log" ]; then
echo "Gzipping access_log"
gzip -9 access_log
fi
wait
if [ ! -z "$cleaned_up" ]; then
# If we used stamp, create a fresh one (effectively spin)
old_stamp=stamp
stamp=$(now)
while [ "$stamp" == "$old_stamp" ]; do
sleep 1
stamp=$(now)
done
fi
# Now timestamp the just-compressed logs.
if [ -f "error_log.gz" ]; then
echo "Timestamping error_log"
mv error_log.gz error_log.$stamp.gz
fi
if [ -f "access_log.gz" ]; then
echo "Timestamping access_log"
mv access_log.gz access_log.$stamp.gz
fi
fi
# Clean up old logs if the disk is getting full (>85%).
df_percent() {
df . --output=pcent | egrep -o '[0-9]+'
}
if [ $(df_percent) -ge 85 ]; then
echo "Cleaning required."
for log in $(/bin/ls -1tr *_log.[0-9]* | head -n -2); do
echo "Cleaning $log"
rm $log
if [ $(df_percent) -lt 85 ]; then
break
fi
done
fi