Last modified 3 years ago
Last modified on 07/10/13 10:05:23
Webserver log file error code checking
Following is a script which is installed on wiki:PuffinServer as /usr/local/bin/weblog-erors, this script was written in response to ticket:563 and this script is run via /etc/logrotate.d/nginx and it sends a email with the results just before the log is rotated each day:
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
/usr/local/bin/nginx-logs
/usr/local/bin/weblog-erors chris@webarchitects.co.uk
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi \
endscript
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
The script can also be run on the commend line and piped into a pager, for example:
sudo /usr/local/bin/weblog-erors | less
weblog-erors
#!/bin/bash
# The log file we are checking, best run the script via logrotate,
# for example edit /etc/logrotate.d/nginx to:
#
# prerotate
# /usr/local/bin/weblog-erors chris@webarchitects.co.uk
# if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
# run-parts /etc/logrotate.d/httpd-prerotate; \
# fi \
# endscript
LOGFILE="/var/log/nginx/access.log"
# Optional email address to send the results to
EMAIL=$1
# check that the script is being run by root
if [[ "$(id -u)" != "0" ]] ; then
echo "You must run $0 as root or via sudo"
exit 2
fi
# grep for all the lines with error codes
ERRORS=$(grep '1.[0|1]" [4|5]0[2|3|4] ' $LOGFILE)
# grep for to totals for these errors codes
ERRORS_403=$(grep -c '1.[0|1]" 403 ' $LOGFILE)
ERRORS_404=$(grep -c '1.[0|1]" 404 ' $LOGFILE)
ERRORS_502=$(grep -c '1.[0|1]" 502 ' $LOGFILE)
ERRORS_503=$(grep -c '1.[0|1]" 503 ' $LOGFILE)
ERRORS_504=$(grep -c '1.[0|1]" 504 ' $LOGFILE)
# check to see if any errors were found
if [[ $ERRORS ]]; then
# check for a email address
if [[ $EMAIL ]]; then
# name of the server
HOSTNAME=$(hostname)
# email subject line
SUBJECT="$ERRORS_403 403, $ERRORS_404 404, $ERRORS_502 502, $ERRORS_503 503 and $ERRORS_504 504 errors from $HOSTNAME"
# we were supplied with a email address so send the results by email using mutt
echo "$ERRORS" | mutt -s "$SUBJECT" $EMAIL
# we don't have a email address so display the results of the grep
else [[ ! $EMAIL ]]
echo "Supply a email address on the command line to send the following results by email"
echo ""
echo "Total 403 errors: $ERRORS_403"
echo "Total 404 errors: $ERRORS_404"
echo "Total 502 errors: $ERRORS_502"
echo "Total 503 errors: $ERRORS_503"
echo "Total 504 errors: $ERRORS_504"
echo ""
echo "Lines with errors from $LOGFILE"
echo ""
echo "$ERRORS"
echo ""
echo "This script is best piped into a pager, eg:"
echo "$0 | less"
fi
else
# we don't want any output if a email address is specified as the script is run via cron
if [[ ! $EMAIL ]] ; then
echo "No recent 403, 404, 502, 503 or 504 errors were found"
fi
fi
