Licenser (aka Heinz N. Gies, ein alter Schulfreund von mir) hat endlich ein Blog! Dort beschreibt er einen originellen One-Liner, mit dem man die Rails-Logs zu einer einfach Besucherstatistik auswerten kann:
cat log/production.log | grep "^Processing" | \\
awk '{print $4}' | sort -u | wc | awk '{print $1}'
In Wirklichkeit wird nur die Anzahl der verschiedenen IPs gezählt, aber es funktioniert. Das interessante daran war, dass er zuerst mit einer recht komplexen Ruby-Lösung begonnen hatte. Wir haben sie gemeinsam vereinfacht und kamen am Ende zu dem Schluss, dass Ruby hier gar nicht nötig ist: Mit ein paar Unix-Hacks, die Lice ausführlich in seinem Blog erklärt, ist das ganze viel kürzer und einfacher zu lösen. Das Tool awk hatte übrigends großen Einfluss auf die Entwicklung von Perl, und damit auch auf Ruby. Wir besinnen uns hier also auf Urahnen.
Heißt das, wir brauchen Ruby nicht mehr? Keineswegs. Eine Integration in Rails fällt nicht schwer. Wir wollen schreiben:rake counter
Was wir brauchen, ist ein Rake-Plugin für Rails. Das geht sehr einfach: .rake-Dateien unterhalb von lib/tasks werden automatisch geladen. Ich habe die Datei stats.rake genannt.
namespace :stats do desc 'Count the visitors with a simple production.log scan' task :visitors do count = `cat log/production.log | grep "^Processing" | \\ awk '{print $4}' | sort -u | wc | awk '{print $1}'`.chomp puts count + ' visitors logged.' end end task :counter => 'stats:visitors'
Namespaces sind billig und machen die vielen Rake-befehle übersichtlicher. Wer sich auskennt, kann die Abkürzung benutzen. Counter fertig und sauber ins Framework integriert, in nicht mal 10 Zeilen Code.
Und einmal mehr fällt mir abschließend nur der Satz ein: Try that in Java!
Weiterlesen:
Kommentar schreiben
Kommentare
Also, zunächstmal geht das Konstrukt auch kürzer und ohne Awk (ausserdem um ein useless use of cat bereinigt): grep "^Processing" log/production.log|grep -Eo "([1-9][0-9]{0,3}\.?){3}[0-9]{1,3}"|sort -u|wc -l Desweiteren ist die Aussagekraft des Ergebnisses recht zweifelhaft. Wenn die Zugriffe kurz aufeinander mit der gleichen IP-Adresse erfolgen (z. B. innerhalb von 5 Minuten), kann IMHO davon ausgegangen werden, dass es sich um den gleichen Benutzer handelt. Ist jedoch eine größere Zeitspanne zwischen den Requests, wurde vermutlich nur die IP-Adresse neu zugewiesen (im Zeitalter von DSL und Dialup-Zugängen eher die Regel) und es handelt sich um einen anderen Benutzer. Im Endeffekt gibst du nur die Anzahl unterschiedlicher IP-Adressen aus, die im production.log stehen. Nicht mehr und nicht weniger.
Im Allgemeinen ist jede Besucherstatistik sehr zweifelhaft. Ich erinnere an Proxies, feste IPs, IPs die sich während einer Session ändern etc. Bei den Projekten die ich durchführe, stelle ich explizit nur Trends und keine Statistiken zur Verfügung. Und diese lassen sich nur durch einfaches Zählen von einzelnen Hits so erstellen, dass man nicht Birnen mit Äpfeln vergleicht. Ansonsten sehr schöner Einsatz von den Standardtools. Dabei frage ich mich immer wie man unter Windows eigentlich leben kann.?.