#!/bin/bash # nothink.org # apt-get install gnuplot # Bash script to parse Apache access log and get total requests and bandwidth with Gnuplot charts GNUPLOT="/usr/bin/gnuplot" if ! [ "${2}" ]; then echo "$0 " echo "$0 /var/log/apache2/ssl_access.log 60" exit 1 fi if [ ! -f "$GNUPLOT" ] then echo "You need install gnuplot!\n" fi if [ -f $1 ] then LOG_FILE=$1 else echo "Error: access log '$1' not exist!" exit 1 fi if [ "${2//[1-9]*}" = "" ]; then INTERVAL=$(($2 * 60)); else echo "Error: interval value not valid!" exit 1 fi FDATE=$(head -1 $LOG_FILE |awk '{print $4}'|sed -e 's/\[//'|sed -e 's/\//-/g'|sed -e 's/:/ /') LDATE=$(tail -n 1 $LOG_FILE |awk '{print $4}'|sed -e 's/\[//'|sed -e 's/\//-/g'|sed -e 's/:/ /') FDATE_S=$(date -d "$FDATE" '+%s'); FDATE_T=$((FDATE_S + $INTERVAL)); COUNT_REQUEST=0 COUNT_BANDWIDTH=0 TOT_REQUEST=0 TOT_BANDWIDTH=0 DATAFILE_REQUEST=$(mktemp) DATAFILE_BANDWIDTH=$(mktemp) RESULTFILE_REQUEST="requests-"$(date -d "$FDATE" '+%Y-%m-%d')".png" RESULTFILE_BANDWIDTH="bandwidth-"$(date -d "$FDATE" '+%Y-%m-%d')".png" TOT_REQUEST=$(wc -l $LOG_FILE | awk {'print $1'}) if [ "$TOT_REQUEST" -eq 0 ]; then echo "No I need more data!" exit 1 fi while read line do LDATE=$(echo $line|awk '{print $4}'|sed -e 's/\[//'|sed -e 's/\//-/g'|sed -e 's/:/ /') LDATE_S=$(date -d "$LDATE" '+%s'); SIZE=$(echo $line| awk '{print $10}') if (( LDATE_S < FDATE_T )); then COUNT_REQUEST=$((COUNT_REQUEST + 1)) if [ "${SIZE//[1-9]*}" = "" ]; then COUNT_BANDWIDTH=$((COUNT_BANDWIDTH + SIZE)) fi else echo "$(date -d @"$((FDATE_T - INTERVAL))" '+%Y-%m-%d %H:%M:%S') $COUNT_REQUEST" >> $DATAFILE_REQUEST echo "$(date -d @"$((FDATE_T - INTERVAL))" '+%Y-%m-%d %H:%M:%S') $COUNT_REQUEST" FDATE_T=$((FDATE_T + INTERVAL)) TOT_REQUEST=$((TOT_REQUEST + COUNT_REQUEST)) COUNT_REQUEST=0; HUMAN=$(echo $COUNT_BANDWIDTH | awk '{ sum=$1 ; hum[1024^3]="Gb";hum[1024^2]="Mb";hum[1024]="Kb"; for (x=1024^3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}') echo "$(date -d @"$((FDATE_T - INTERVAL))" '+%Y-%m-%d %H:%M:%S') $HUMAN" >> $DATAFILE_BANDWIDTH echo "$(date -d @"$((FDATE_T - INTERVAL))" '+%Y-%m-%d %H:%M:%S') $HUMAN" TOT_BANDWIDTH=$((TOT_BANDWIDTH + COUNT_BANDWIDTH)) COUNT_BANDWIDTH=0; echo "" fi done <$LOG_FILE if [ "$TOT_REQUEST" -eq 0 ]; then echo "Warning: I need more data into the interval $INTERVAL seconds!" exit 1 fi HUMAN=$(echo $TOT_BANDWIDTH | awk '{ sum=$1 ; hum[1024^3]="Gb";hum[1024^2]="Mb";hum[1024]="Kb"; for (x=1024^3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}') echo "Total requests : $TOT_REQUEST" echo "Total bandwidth : $TOT_BANDWIDTH bytes, $HUMAN" $GNUPLOT << EOF reset set title "Requests per time ($FDATE - $LDATE, interval $INTERVAL seconds, $TOT_REQUEST requests)" set xdata time set timefmt "%Y-%m-%d %H:%M:%S" set format x "%H:%M" set autoscale set ytics set grid y set auto y set grid ytics lc rgb "#bbbbbb" lw 1 lt 0 set grid xtics lc rgb "#bbbbbb" lw 1 lt 0 set output "$RESULTFILE_REQUEST" set terminal png size 900,600 set xlabel "Time" set ylabel "Request" set grid set boxwidth 0.95 relative set style fill solid 0.5 plot "$DATAFILE_REQUEST" using 1:3 w boxes lc rgb "green" notitle EOF $GNUPLOT << EOF reset set title "Bandwidth per time ($FDATE - $LDATE, interval $INTERVAL seconds, $HUMAN)" set xdata time set timefmt "%Y-%m-%d %H:%M:%S" set format x "%H:%M" set autoscale set ytics set grid y set auto y set grid ytics lc rgb "#bbbbbb" lw 1 lt 0 set grid xtics lc rgb "#bbbbbb" lw 1 lt 0 set output "$RESULTFILE_BANDWIDTH" set terminal png size 900,600 set xlabel "Time" set ylabel "Bandwidth" set grid set boxwidth 0.95 relative set style fill solid 0.5 plot "$DATAFILE_BANDWIDTH" using 1:3 w boxes lc rgb "green" notitle EOF rm -f $DATAFILE_REQUEST rm -f $DATAFILE_BANDWIDTH echo "Charts generated : $RESULTFILE_REQUEST, $RESULTFILE_BANDWIDTH" echo "" exit 0