Squid - Access - Log - Auswertung

 ZielstellungHilfsklassen:  db_access.class,  sql_util.class,  query.classausführbar:  AuswertungSchreiben in DBDatenbank 

Als Tutor an der HS Wismar betreute ich die WWW - Dienste am FB Wirtschaft der HS. Nach der Installation neuer Versionen des Apache und des Squid lief alles wie gewohnt weiter (ständige Updates sind nicht in unserem Sinne), so daß ich mich an die Programmierung einer Auswertung für die Daten des Squid machte.
 

Ziel

Ziel der Auswertung ist primär die Ermittlung der URL's, die zu einem bestimmten Zeitpunkt in den Cache vorgeladen werden sollten. Es geht also weniger darum herauszufinden, wie oft eine URL geladen wurde, sondern eher darum, welche URL's z.B. täglich in den frühen Morgenstunden vorgeladen werden sollten. Als Ergebnis paßt sich der Squid den Gewohnheiten seiner Nutzer an, d.h. er bekommt "seine" Seite sofort und ohne Wartezeiten aus dem Cache geliefert. Dies trifft sicherlich vor allem bei regelmäßigen Erscheinungen (Zeitschriften etc.pp.) und persönlichen Vorlieben zu.

Als Nebeneffekt kann man natürlich auch jede Menge Statistik mit den Zahlen machen, da die Daten der aus dem Netz gespeicherten URL's gespeichert sind.

Und wer dies nicht braucht, kann dies immer noch als Vorlage und Anregung für eigene Programme nehmen.
 

Hilfsklassen

Der Programmaufbau ist trotz Ausführung in Java nicht gerade ein Musterbeispiel an objektorientoierter Programmierung. In diesem Fall verwendet die Hauptklasse 3 Hilfsklassen.

DB_Access.class

 [Sourcecode]

regelt die grundlegende Datenbankverbindung. Sie beinhaltet alle notwendigen Daten und ist bei der Installation neu zu übersetzen, da ich mir das Behandeln einer ini - Datei bisher erspart habe.

Enthalten ist die Beispielanbindung unter PostgreSQL mit einem virtuellem Acount. Dieser Teil ist abhängig von dem verwendeten JDBC - Treiber der Datenbank.

Die vielfach verwendeten JDBC - ODBC - Bridges sind übrigens (bei mir z.B.  25x) langsamer! Programmiert wurde in Java 1.1.3.

SQL_Util.class

 [Sourcecode]

Klasse, die Ergebnisse übernimmt, ResultSet û Objekte verarbeitet und ausgibt.

public ResultSet query(String Query)
public void lineDisplay(ResultSet Result)

Ausgabe der Ergebnisse nach STDOUT
public void htmlDisplay(ResultSet Result)

Ausgabe der Ergebnisse als HTML - Seite (mit Tabelle formatiert) nach STDOUT
public void graphDisplay(ResultSet Result) (noch zu prg.)

Query.class

 [Sourcecode]

Klasse, die Anfragen auf Benutzerebene behandelt und sich Methoden aus der SQL_Util.class bedient.

An ihrer Stelle können andere Klassen treten, die komplexere Auswertungen (z.B. interne, erneute Verarbeitung des ResultSet für erneute Abfrage) vornehmen.

new Query(String Ausgabeformat, String query);

die ausführbaren Klassen

Squid_Access_Auswertung.class

 [Sourcecode]

Klasse, die die Eingaben (von STDIN) entgegennimmt und entsprechend weitergibt.
 

Aufruf:

    java [-classpath ...] Squid_Access_Auswertung ûAusgabe ûModus Parameter
     

Ausgabeformate:

    -line: Gibt das Ergebnis zeilenweise mit durch _,_ getrennte Felder aus; eignet sich auch zur Umlenkung in Datei oder Einbindung in Pipes
     
    -html: gibt Ergebnis s.o. mit HTML û Tabellenformatierungen auf Console aus! Zur Weiterverarbeitung in Datei umlenken oder in PIPE weiterverarbeiten!

    -graph: gibt die Ergebnisse grafisch aus noch nicht programmiert
     

Modi:

    -query "SQL-Anweisung" : führt die angegebene Anweisung aus.

    -modul NAME [Startdatum]: führt Modul "Name" aus (s.u.)
    bei Angabe des Startdatums (Form: MM/DDYY) wird die Abfrage ab
    einschließlich diesem Datum ausgeführt
     

Module

Module gestatten die fest voreingestellte Abfrage von Statistiken.

Diese können ab einem bestimmten Datum ausgeführt werden und auf verschiedene Weise ausgeführt werden.
 

Für alle anderen Fälle können eigene SQL û Statements abgesetzt werden!
(die Namensgebung ist sicherlich noch bearbeitungsfähig!)

tcp-hitrate
zählt die Einträge, TCP_HITÆs zusammen und errechnet daraus die Trefferquote in %

domain-hits
gibt eine Liste der angeforderten Domain û Namen (mit TCP_HIT) mit der Trefferzahl geordnet nach Trefferquote aus

domains
Liste aller Domainen, deren URL mit einem TCP_* erfolgreich bearbeitet wurden

access-tag
geordnete Liste der Access - Tags mit Häufigkeit geordnet

hierachy-tag
geordnete Liste der Hierachy - Tags mit Häufigkeit geordnet

protocol
geordnete Liste der verwendeten Protokolle (ohne ERR_*)

method
geordnete Liste der verwendeten Methoden (ohne ERR_*)

clients
geordnete Liste der Clients

Bearbeitungszeit
minimale, maximale und durchschnittle Bearbeitungszeit

Zugriff_Stunde
nach Zugriffen geordnete Liste der Zugriffe in den Tagesstunden 0-24

Stunde
nach den Tagesstunden geordnete Liste der Zugriffe in den Tagesstunden 0-24

Zugriffe_Woche, Woche, Zugriffe_Monat, Monat
wie Zugriff_Stunde und Stunde, nur eben mit Wochennr. und Monatsnr.

 

Squid_access_log2db.class

 [Sourcecode]

Schreibt das Logfile in die Datenbank.
 

Aufruf: java Squid_access_log2db </abs. Path/Logfilename> [ab Satznr.]

Dabei wird das Logfile (hier ein  kurzes Beispiel ) entsprechend aufgeteilt und das SQL - Statement zusammengesetzt. Da dabei durch leere Felder o.ä. immer wieder Fehler durch die SQL - Datenbank auftraten, gibt diese Klasse bei einem Abbruch die entsprechende Satznummer mit aus.

Anhand dieser Satznummer kann die Klasse wieder nach dem Satz neu gestartet werden. Bindet man dies in ein entsprechendes Skript ein (welches z.B. auch die Logfiles rotiert) , wird eine vollständige Abarbeitung gewährleistet.
 

Datenbank

in ihr befinden sich alle Datensätze = Squid - Access - Logzeilen.

Sie kann ziemlich groß werden, in der Zeit vom 2.3.98 - 10.3.98 habe ich 178000 Sätze vorliegen!

Im vorliegendem Fall wurde eine SQL - Datenbank verwendet, auch Subqueries beherrschen muß. Zum Einsatz kamen MS SQL - Server unter Windows NT zur Programmierung zu Hause. Das Zielsystem ist Oracle unter SunOS.

Unter Linux gestaltete sich die Wahl der DB schwierig. Ich hatte mit ADABAS einige Probleme, PostgreSQL konnte keine Subqueries verarbeiten und Informix Interbase wurde in der kostenlosen Version ohne JDBC - Treiber geliefert. I.A. habe ich mir gerade Informix für Linux besorgt.

Mit der richtigen Datenbank ist das Programm einsatzfähig, bis auf die Subqueries werden keine spezifischen SQL - Befehle verwendet.
 
Desweiteren ist natürlich von der Zugriffsmasse und den Systemressourcen abhängig, wieviel Daten man speichern kann. Aber das Herausfiltern von Daten ist auch in der  squid-access-log2db.class möglich.

Datenfelder

 [Tabellen - Generierungsscript]

Nachfolgend eine Aufstellung der verwendeten Felder aus dem squid-access.log. Für eine genaue Beschreibung s. a. Squid - Doku.

  1. Date:  02.03.98 16:19
  2. counter: 0 .. zählt Zugriffe zur selben Zeit
  3. client: 192.175.240.167: Adresse des Clients
  4. method: GET POST
  5. protocol: http ftp ...
  6. domain: www.iomega.de bis zum ersten /
  7. path: pfad/datei.ext de de/ oder leer!
  8. Access_tag: TCP_MISS TCP_HIT ....
  9. hierachy_tag: SINGLE_PARENT DIRECT NONE
  10. elapsed_time: 23999 ..

  ZielstellungHilfsklassen:  db_access.class,  sql_util.class,  query.classausführbar:  AuswertungSchreiben in DBDatenbank 

/td>/table>