===== Log-Dateien des print2forms Servers ===== ==== Anforderung ==== Der (p2f)-Server schreibt neben seinem eigentlichen Log, in dem die Kommunikation mit den (p2f)-Clients, -Gateways, -Routern, -Proxies und dem Administrationsprogramm protokolliert wird, noch zwei weitere Log-Dateien. In der einen - Name beginnt mit ''access'' - werden die Zugriffe auf die (p2f)-Objekte registriert, in der anderen - Name beginnt mit ''statistic'' - wird auch registriert, welches Objekt auf wievielen Seiten eines Druckauftrags verwendet wurde. Wird bei der Konfiguration des (p2f)-Servers ein monatliches Protokoll angefordert, können die beiden Log-Dateien für die Zugriffe und die Statistik auf beachtliche Ausmasse im Bereich von mehreren Gigabyte anwachsen. Wenn im (p2f)-System keine Statistikdaten ausgewertet werden, sind die beiden Log-Dateien nur Balast, der bei längerem Betrieb die Festplatte des Rechners füllen kann, wenn die Log-Dateien nicht aktiv verwaltet werden (z.B. durch Aufruf von Skripten beim Wechsel der Log-Dateien). Aus diesem Grund werden die Log-Dateien für die Zugriffe und die Statistik ab dem (p2f)-Server Build 821 ebenfalls einer Grössenbeschränkung unterworfen. \\ \\ ==== Realisierung ==== Die maximale Grösse der eigentlichen Log-Dateien des (p2f)-Servers - Name beginnt mit ''p2fServer'' - kann im Kontrollfeld des Servers eingestellt werden. Erreicht die Log-Datei diese Grösse, wird sie geschlossen, ihr Name erhält das Suffix ''.old'' und es wird eine neue Log-Datei geöffnet. Eine eventuell bereits vorhandene Log-Datei mit dem Suffix ''.old'' wird dabei überschrieben. Mit dem neuen Build des (p2f)-Servers werden die Log-Dateien für die Zugriffe und die Statistik ganz analog behandelt. Es gelten dieselben Grössenbeschränkungen wie für die eigentliche Log-Datei. Insofern ist keine neue Konfiguration notwendig. Da mit dem Überschreiben einer alten Log-Datei aber Daten unweigerlich verloren gehen, bekommt der Aufruf eines Skriptes beim Wechsel der Log-Datei eine existentielle Bedeutung, wenn die Zugriffs- oder Statistikdaten für Auswertungen benötigt werden. Auf der Registerkarte //Protokolleinstellungen// befindet sich im unteren Teil ein Eingabefeld mit dem Titel //Protokollkommando//. In diesem Feld kann ein Programm oder ein Skript angegeben werden, welches aufgerufen werden soll, sobald eine Log-Datei geöffnet oder geschlossen wird. \\ \\ {{print2forms:tips:0033-1.PNG}} \\ \\ Der Aufruf des Programms oder Skripts wird dabei um den Namen der betreffenden Log-Datei und um den Grund für den Aufruf ergänzt. Komplette Aufrufe sähen dann etwa wie folgt aus: C:/Perl/bin/perl.exe "E:/Logs/Log.pl" "E:\Logs\p2fServer-2014w09.log" CREATE C:/Perl/bin/perl.exe "E:/Logs/Log.pl" "E:\Logs\statistic-2014w09.csv" OPEN C:/Perl/bin/perl.exe "E:/Logs/Log.pl" "E:\Logs\access.2014w09.log" CLOSE SIZE Wie zu sehen ist, wird der Grund für den Aufruf des Programms oder Skripts in Form von vier Schlüsselworten mitgeteilt, deren Bedeutung der nachfolgenden Tabelle entnommen werden kann. | CREATE | Die zuvor angegebene Log-Datei wurde neu angelegt. | | OPEN | Die zuvor angegebene Log-Datei wurde zum Schreiben geöffnet. | | CLOSE(sp)SIZE | Die zuvor angegebene Log-Datei wurde wegen Erreichens der Grössenbeschränkung geschlossen und umbenannt, indem das Suffix ''.old'' angehängt wurde. | Hier ein Beispiel für ein Skript, welches verhindert, dass die alten Log-Datein überschrieben werden, indem es beim Schliessen der Log-Datei diese 'sichert', indem es ein Suffix mit einem Timestamp anhängt. Die Aufrufe des Skripts werden dabei in einer eigenen kleinen Log-Datei protokolliert. Hierbei ist zu beachten, dass beim Aufruf des Skriptes mit ''CLOSE'' und ''SIZE'' die Log-Datei bereits umbenannt worden ist (mit dem Suffix ''.old''). \\ \\ use Time::HiRes qw(gettimeofday); use strict; # Folgende Zeile im Kontrollfeld p2fServer auf der Seite Protokolleinstellungen # im Eingabefeld Protokollkommando einfügen (Auf eigene Verhältnisse anpassen!) # "C:/Perl/bin/perl.exe" "E:/Logs/Log.pl" # my own logfile my $Log ="e:/Logs/logcmd.log"; open(LOG, '>>', $Log); # get time for timestamp my ($S, $M, $H, $d, $m, $y) = localtime(time); if($ARGV[1] eq "CLOSE" and $ARGV[2] eq "SIZE") { # get seconds and microseconds since the epoch my ($sec, $usec) = gettimeofday(); my $Name = sprintf "%s-%d%06d", $ARGV[0], $sec, $usec; rename $ARGV[0],$Name; printf LOG "%04d-%02d-%02d %02d:%02d:%02d %s %s %s: %s\n", $y+1900,$m+1,$d,$H,$M,$S, $ARGV[0], $ARGV[1], $ARGV[2], $Name ; } else { printf LOG "%04d-%02d-%02d %02d:%02d:%02d %s %s %s\n", $y+1900,$m+1,$d,$H,$M,$S, $ARGV[0], $ARGV[1], $ARGV[2]; } close LOG; exit 0; \\ \\ Als Beispiel für die Reihenfolge von Aufrufen dieses Skriptes in einem echten Umfeld, hier ein Auszug aus der Log-Datei des Skriptes. Nur bei den Aufrufen mit ''CLOSE'' und ''SIZE'' tritt das Skript wirklich in Aktion. 2014-03-04 11:57:02 E:\Logs\p2fServer-2014w09.log CREATE 2014-03-04 11:57:49 E:\Logs\access.2014w09.log CREATE 2014-03-04 11:58:20 E:\Logs\statistic-2014w09.csv CREATE 2014-03-04 11:58:46 E:\Logs\statistic-2014w09.csv.old CLOSE SIZE: E:\Logs\statistic-2014w09.csv.old-1393930726497194 2014-03-04 11:59:09 E:\Logs\access.2014w09.log.old CLOSE SIZE: E:\Logs\access.2014w09.log.old-1393930749413634 2014-03-04 11:59:09 E:\Logs\p2fServer-2014w09.log.old CLOSE SIZE: E:\Logs\p2fServer-2014w09.log.old-1393930749725634 2014-03-04 11:59:36 E:\Logs\access.2014w09.log.old CLOSE SIZE: E:\Logs\access.2014w09.log.old-1393930776887283 2014-03-04 12:00:54 E:\Logs\p2fServer-2014w09.log OPEN 2014-03-04 12:01:07 E:\Logs\statistic-2014w09.csv OPEN 2014-03-04 12:01:24 E:\Logs\statistic-2014w09.csv.old CLOSE SIZE: E:\Logs\statistic-2014w09.csv.old-1393930884125072 2014-03-04 12:02:00 E:\Logs\access.2014w09.log OPEN 2014-03-04 12:02:01 E:\Logs\p2fServer-2014w09.log.old CLOSE SIZE: E:\Logs\p2fServer-2014w09.log.old-1393930921077938 \\ ==== Hinweise ==== * Das Beispielskript setzt natürlich die Grössenbeschränkungen für die Log-Dateien direkt ausser Kraft, genausso wie die grössenbeschränkten Log-Dateien selbst sich ansammeln werden (wenn auch viel langsamer), wenn sie nicht von Zeit zu Zeit händisch oder aber mit einem Automatismus gelöscht oder weggeschrieben werden. * Aufgabe eines realen Skripts sollte daher auch sein, alte, nicht mehr benötigte Log-Dateien zu löschen, wenn die maximale Grösse der Log-Dateien im Verhältnis zum freien Platz auf der Festplatte vermuten lässt, dass die Festplatte in absehbarer Zeit voll werden wird. Alte Dateien sind aufgrund des Datums im Dateinamen leicht auszumachen.