wiki:Server/Log

Besucherauswertung (Logfileanalyse)

Das ist eines meiner Spezialgebiete, hierfür hab ich zu meinen Lebzeiten schon viel Software geschrieben (die leider nie fertig wurde - da war etwa dieses modulare Logfileanalyseprogramm in Perl). Defacto sind die Platzhirsche da heute nach wie vor Webalizer und AWStats. Interessant für uns ist auch Piwik, ein OpenSource-Programm mit Funktionen wie Google Analytics.

Installierte Software

Piwik

Dieser Abschnitt ist nicht mehr aktuell: Mittlerweile gibt es eine zentrale Piwik-Installation für ILIAS, PWP und POTT, die asynchron lädt und Opt-Out anbietet.

Am 16.10.2011 hab ich Piwik unter https://dev.elearning.physik.uni-frankfurt.de/logs/piwik installiert. Dazu einen Standard-Javascript-Tag in den Footer vom Physik-ILIAS-Template. Insbesondere wollte ich zusätzliche HTTPS-Verbindungen vermeiden und hab einen Softlink gesetzt in /var/www/elearning/local, was seinerseits unter https://elearning.physik.uni-frankfurt.de/local gemountet ist (Apache Alias).

Verbesserungspotential:

  • Asynchrones Laden von Piwik
  • Seite zum Opt-Out

Datenschutz

An der Uni Frankfurt dürfen keine IP-Adressen gespeichert werden. Hintergründe und technische Lösungen schlug ich bereits auf meinem Artikel MediaWiki in der Uni Frankfurt: Logfiles und Besucherstatistiken vor, insbesondere IP-Hashing im gleichen Zielraum (a.b.c.d wird eindeutig irreversibel w.x.y.z und bleibt damit gültige IPv4-Addy).

Sources für Datenschutz

Insbesondere hab ich dabei auch einen kleinen Spamfilter für Logfiles implementiert, weil viel Referer-Spamming auftrat:

#!/bin/perl
# filename: strip-spam.pl
# zum einbinden von der anomyizer-Datei

use strict;

my $blacklist_url = 'http://biokemika.uni-frankfurt.de/w/index.php?title=BioKemika:Statistik/Blacklist&action=raw';
our $blacklist_debug = 0;


# Load file in list
my $blacklist_raw = `wget -qO -  "$blacklist_url"`;
my @blacklist = split(/\n/, $blacklist_raw);

# lowercase, strip whitespaces, etc.
@blacklist = map(lc, @blacklist);
@blacklist = map {s/^\s+|\s+$//g; $_;} @blacklist;

#$, = ", "; print @blacklist;

sub is_spam {
        my $line = shift;
        foreach(@blacklist) {
                if($line =~ /$_/o) {
                        if($blacklist_debug) {
                                print "Spam: $_ => $line\n";
                        }
                        return 1;
                }
        }
        return 0;
}

Und der eigentliche Anonymisierer:

#!/usr/bin/perl -w
# filename: anonymize-logs.pl
# Script fuer BioKemika-Server zum anonymisieren von Logfiles
#

use IP::Anonymous;
use File::Basename;

require "strip-spam.pl";

@key = (0..31);
my $anon = new IP::Anonymous(@key);

# Durch Logfiles gehen und anonymisierte Versionen rueberholen.
$target_directory = "/var/www/logs/anonymous_logs";

my $spam_counter = 0;
my $ham_counter = 0;

while( </var/log/httpd/access_log* /var/log/httpd/proxy_log*>  ) {
        $filename = basename($_);
        open(IN, "<$_") or die "Could not open input log file $_: $!\n";
        $target = "$target_directory/$filename";
        open(OUT, ">$target") or die "Could not open output log file $target: $!\n";
        print "Opened $filename => $target\n";
        while(<IN>) {
                if(is_spam($_)) {
                        # skip line
                        $spam_counter++;
                        next;
                } else {
                        $ham_counter++;
                }

                if( /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/ ) {
                        # rewrite IP adress
                        $ip = $1;
                        $new_ip = $anon->anonymize($ip);
                        #print "Rewrite $ip => $new_ip\n";
                        $_ =~ s/$ip/$new_ip/;
                }
                print OUT;
        }
        close(IN); close(OUT);
}

print "Spam: $spam_counter, Ham: $ham_counter\n";

Das ganze wurde dann einfach vor die eigentliche Analyse gestellt:

#!/bin/bash -x
# filename: loganalyse.sh

echo "BioKemika Logoanalyse am $(date)"
cd /var/www/logs/bin

echo "anonymize logs:"
/var/www/logs/bin/anonymize-logs.pl 2>&1

echo
echo "Running weblaizers:"
/var/www/logs/webalizer/generate.sh

echo "Done at $(date)"

Sodass das insgesamte Setup so aussah:

cgibioke@biokemika /srv/logs/bin $ ls 
anonymize-logs.pl  loganalyse.sh  strip-spam.pl
cgibioke@biokemika /srv/logs/bin $ crontab -l
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/

# min hour day month weekday

# daily:
42 3 * * * /srv/logs/bin/loganalyse.sh 2>&1 > /dev/null

Das hat sich hervorragend bewährt. Referer-Spamming und IP-Anonymisierung sind Dinge, die mir aber vorher sonst auch nie begegnet sind…

Last modified 3 years ago Last modified on Apr 28, 2014 2:34:15 PM