Parsing Wowza Logs

I’ve been wanting to look at Wowza logs for a very long time. I just spent a couple of hours writing a Bash script that generates a stats report. It parses the Wowza log file for the IP addresses, and runs them and against a site called to get the viewer’s geo location. The output is filtered, sorted, takes a count, and finally generates a webpage. Here’s the Bash script.

# Can be placed in cron to run. wowzastreamingengine_access.log
# check for missing argument
if [ -z "$1" ]
    echo "No arguments supplied. Format: wowzastreamingengine_access.log"
    exit 1
# get the ips from the wowza log file
awk '{print $17}' $1 > output1.txt
# exclude invalid ips 
grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' output1.txt > output2.txt
# sort unique ips
cat output2.txt | sort -u | uniq > ips.txt
# pause for 1s
sleep 1s
# empty file just in case
> output3.txt
# set filename
# read filename and get geo info
while read -r ipaddress; do
  curl"$ipaddress" 2>/dev/null | awk -F'"' '$2=="city"{printf("%s, ", $4)}$2=="region"{print $4}' >> output3.txt
done < "$filename"
# cleanup empty geo locations
grep -v '^,' output3.txt > output4.txt
# sort output alphabetically
cat output4.txt | sort > output5.txt
# get a count of connections
count=$(wc -l < output5.txt)
# get today's date
filename=$(date +%Y%m%d)
date=`date +'%A %B %d, %Y'`
# rename file
mv output5.txt $filename.txt
# generate web page
cat <<EOF > $filename.php
<title>Wowza Streaming Stats on $date</title>
<h1>Live Streaming Stats</h1>
<p>Number of connections on $date: $count</p>
<?php include('$filename.txt');?>
# move files to web directory
cp $filename.* /var/www/html
# cleanup files
rm output*.txt
rm ips.txt

How to Rotate Apache Logs

Apache comes with a logrotate utility. You can customize the way logrotate behaves by editing the /etc/logrotate.d/apache file. The logrotate utility has many options. In this example, we are rotating the log files that are located at the /var/www/ directory. We are instructing the log files to rotate monthly for a total of 24 times. We are compressing the files by zipping them. We are using the date extension as part of the filename. We are also delaying the compression until the log has been rotated at least twice. Finally, Apache is restarted.

$ sudo nano /etc/logrotate.d/apache
/var/www/*.log {
  rotate 24
  create 640 root adm
    if /etc/init.d/apache2 status > /dev/null ; then \
      /etc/init.d/apache2 reload > /dev/null; \
    if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
      run-parts /etc/logrotate.d/httpd-prerotate; \
    fi; \

To learn more about the logrotate utility, please visit the documentation.