===== 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.