| 1 | = Webserver log file error code checking = |
| 2 | |
| 3 | Following is a script which is installed on wiki:PuffinServer as {{{/usr/local/bin/weblog-erors}}} and which is run via {{{/etc/logrotate.d/nginx}}} and it sends a email with the results just before the log is rotated each day: |
| 4 | |
| 5 | {{{ |
| 6 | /var/log/nginx/*.log { |
| 7 | daily |
| 8 | missingok |
| 9 | rotate 52 |
| 10 | compress |
| 11 | delaycompress |
| 12 | notifempty |
| 13 | create 0640 www-data adm |
| 14 | sharedscripts |
| 15 | prerotate |
| 16 | /usr/local/bin/nginx-logs |
| 17 | /usr/local/bin/weblog-erors chris@webarchitects.co.uk |
| 18 | if [ -d /etc/logrotate.d/httpd-prerotate ]; then \ |
| 19 | run-parts /etc/logrotate.d/httpd-prerotate; \ |
| 20 | fi \ |
| 21 | endscript |
| 22 | postrotate |
| 23 | [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` |
| 24 | endscript |
| 25 | } |
| 26 | }}} |
| 27 | |
| 28 | The script can also be run on the commend line and piped into a pager, for example: |
| 29 | |
| 30 | {{{ |
| 31 | sudo /usr/local/bin/weblog-erors | less |
| 32 | }}} |
| 33 | |
| 34 | == weblog-erors == |
| 35 | |
| 36 | {{{ |
| 37 | #!/bin/bash |
| 38 | |
| 39 | # The log file we are checking, best run the script via logrotate, |
| 40 | # for example edit /etc/logrotate.d/nginx to: |
| 41 | # |
| 42 | # prerotate |
| 43 | # /usr/local/bin/weblog-erors chris@webarchitects.co.uk |
| 44 | # if [ -d /etc/logrotate.d/httpd-prerotate ]; then \ |
| 45 | # run-parts /etc/logrotate.d/httpd-prerotate; \ |
| 46 | # fi \ |
| 47 | # endscript |
| 48 | LOGFILE="/var/log/nginx/access.log" |
| 49 | |
| 50 | # Optional email address to send the reults to |
| 51 | EMAIL=$1 |
| 52 | |
| 53 | # check that the script is being run by root |
| 54 | if [[ "$(id -u)" != "0" ]] ; then |
| 55 | echo "You must run $0 as root or via sudo" |
| 56 | exit 2 |
| 57 | fi |
| 58 | |
| 59 | # grep for all the ilines with error codes |
| 60 | ERRORS=$(grep '1.[0|1]" [4|5]0[2|3|4] ' $LOGFILE) |
| 61 | # grep for to totals for these errors codes |
| 62 | ERRORS_403=$(grep -c '1.[0|1]" 403 ' $LOGFILE) |
| 63 | ERRORS_404=$(grep -c '1.[0|1]" 404 ' $LOGFILE) |
| 64 | ERRORS_502=$(grep -c '1.[0|1]" 502 ' $LOGFILE) |
| 65 | ERRORS_503=$(grep -c '1.[0|1]" 503 ' $LOGFILE) |
| 66 | ERRORS_504=$(grep -c '1.[0|1]" 504 ' $LOGFILE) |
| 67 | |
| 68 | # check to see if any errors were found |
| 69 | if [[ $ERRORS ]]; then |
| 70 | # check for a email address |
| 71 | if [[ $EMAIL ]]; then |
| 72 | # we were supplied with a email address so send the results by email using mutt |
| 73 | # name of the server |
| 74 | HOSTNAME=$(hostname) |
| 75 | # email subject line |
| 76 | SUBJECT="$ERRORS_403 403, $ERRORS_404 404, $ERRORS_502 502, $ERRORS_503 503 and $ERRORS_504 504 errors from $HOSTNAME" |
| 77 | echo "$ERRORS" | mutt -s "$SUBJECT" $EMAIL |
| 78 | # we don't have a email address so display the results of the grep |
| 79 | else [[ ! $EMAIL ]] |
| 80 | echo "Supply a email address on the command line to send the following results by email" |
| 81 | echo "" |
| 82 | echo "Total 403 errors: $ERRORS_403" |
| 83 | echo "Total 404 errors: $ERRORS_404" |
| 84 | echo "Total 502 errors: $ERRORS_502" |
| 85 | echo "Total 503 errors: $ERRORS_503" |
| 86 | echo "Total 504 errors: $ERRORS_504" |
| 87 | echo "" |
| 88 | echo "Lines with errors from $LOGFILE" |
| 89 | echo "" |
| 90 | echo "$ERRORS" |
| 91 | echo "" |
| 92 | echo "This script is best piped into a pager, eg:" |
| 93 | echo "$0 | less" |
| 94 | fi |
| 95 | else |
| 96 | # we don't want any output if a email address is specified as the script is run via cron |
| 97 | if [[ ! $EMAIL ]] ; then |
| 98 | echo "No recent 403, 404, 502, 503 or 504 errors were found" |
| 99 | fi |
| 100 | fi |
| 101 | }}} |