Zielstellung | Hilfsklassen: db_access.class, sql_util.class, query.class | ausführbar: Auswertung / Schreiben in DB | Datenbank
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 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.
Der Programmaufbau ist trotz Ausführung in Java nicht gerade ein Musterbeispiel an objektorientoierter Programmierung. In diesem Fall verwendet die Hauptklasse 3 Hilfsklassen.
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.
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.) |
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); |
Klasse, die die Eingaben (von STDIN) entgegennimmt und entsprechend weitergibt.
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 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!)
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.
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.
[Tabellen - Generierungsscript]
Nachfolgend eine Aufstellung der verwendeten Felder aus dem squid-access.log. Für eine genaue Beschreibung s. a. Squid - Doku.
Zielstellung | Hilfsklassen: db_access.class, sql_util.class, query.class | ausführbar: Auswertung / Schreiben in DB | Datenbank
/td>/table>