Almetare
1.15
Alle meine Taschenrechner - Eine C++-Bibliothek zur Entwicklung von Taschenrechnern
|
Klasse zum Loggen von Laufzeitausgaben in eine Datei. Mehr ...
#include <logging.h>
Öffentliche Methoden | |
Log (const string &fname="", int channels=hgh|cns|med, int maxLen=50000, const string &toLog="", const string &progName="Unknown", const string &version="Vx.x") | |
Vorlaeufige Konstruktion eines Log-Objektes. Mehr ... | |
int | init (const string &fname, int channels, int maxLogLen, const string &fileToLog, const string &progName, const string &version) |
Initialisiert die Dateinamen und Channels. Mehr ... | |
ofstream * | getFstreamP () |
int | getConfChannels () const |
void | stopLogging () |
Schliesst Datei und loescht den allokierten ofstream. Mehr ... | |
void | setConfChannels (int chans) |
bool | configured (int channels, const char *file, int line) |
Prueft, ob die geforderten Kanaele ueberhaupt "eingeschaltet" sind und die Groesse des Logfiles. Mehr ... | |
ios::fmtflags | setf (ios::fmtflags format) |
Öffentliche, statische Methoden | |
static string | getDate () |
Gibt String mit dem aktuellen Datum der Systemuhr im Format "Wed Dec 21 2000" zurueck. Mehr ... | |
static string | getTime () |
Gibt die Systemuhrzeit als String im Format "hh:mm:ss" zurueck. Mehr ... | |
static string | channelsToStr (int channels) |
Wandelt channels ch in einen String um. Mehr ... | |
static int | strToChannels (const string &str) |
Wandelt String str in channels um. Mehr ... | |
Private Methoden | |
void | writeHeader () |
Schreibt Datei-Header. Mehr ... | |
int | backupLogFile () |
Benennt die Logdatei *.txt in *.bak um und loescht zuvor eine aeltere *.bak-Datei, falls vorhanden. Mehr ... | |
Private Attribute | |
string | mFname |
Name d. Datei, in die geloggt wird ("" = Konsole) | |
ofstream * | mFstreamP |
Filestream der Datei. | |
int | mConfChannels |
Kanaele, die konfiguriert sind (z. B. per Ini-Datei) | |
string | mFileToLog |
Name der Quelltextdatei, die als einzige geloggt wird. | |
int | mMaxLogLen |
maximale Laenge der Log-Dateien in Byte | |
bool | mIsSuppressed |
Ausgabe unterdrueckt. | |
string | mProgName |
Name des Programms (fuer Titelzeile der Log-Datei) | |
string | mVersion |
Version des Programms (fuer Titelzeile der Log-Datei) | |
Klasse zum Loggen von Laufzeitausgaben in eine Datei.
Ein Objekt der Klasse Log erlaubt das Loggen von beliebigen Datentypen in eine Datei und/oder die Konsole unter Verwendung von deren Ausgabeoperatoren und der von cout bekannten "<<"-Syntax. Uhrzeit und Zeilennummern werden der Ausgabe automatisch vorangestellt. Z.B.:
Die Groesse der Datei wird ueberwacht; bei Erreichen der Maximalgroesse wird die Datei geschlossen, in "*.bak" umbenannt und eine neue Datei desselben Namens geoeffnet.
Die Logausgaben werden im Quelltext hart in einen "Kanal" geleitet ("hgh", "gnl", "low" etc.), die Ausgaben werden von der Klasse nur dann gelogged, wenn dieser Kanal auch eingeschaltet ist; Ein- und Ausschalten von Kanaelen ist bei der Initialisierung oder dynamisch zur Laufzeit moeglich. Drei Log-Objekte werden als globale Variablen in logging.cpp definiert und durch die Makros ONL_LOG, DBG_LOG und ERR_LOG gekapselt. Diese drei Log-Objekte stehen also in der ganzen Applikation ohne jede weitere Initialisierung zur Verfuegung.
Weitere Log-Objekte koennen nicht ohne weiteres hinzugefuegt werden, weil sie wahlweise auch alle mit derselben Datei verknuepft werden koennen. Daher muessen sie in der richtigen Reihenfolge initialisiert und die Dateien geschlossen werden, was in den Funktionen init() und stopLogging() durch Abfrage genau dieser drei Objekte geschieht.
Beispiele:
Stack<double> st;
ERR_LOG(hgh) << "Stack empty!" << NL;
ONL_LOG(med) << st << NL;
DBG_LOG(gnl) << 3.14 << NL;
Log::Log | ( | const string & | fname = "" , |
int | channels = hgh | cns | med , |
||
int | maxLogLen = 50000 , |
||
const string & | fileToLog = "" , |
||
const string & | progName = "Unknown" , |
||
const string & | version = "Vx.x" |
||
) |
Vorlaeufige Konstruktion eines Log-Objektes.
Die eigentliche Initialisierung kann nicht im Konstruktor gemacht werden, da beim Aufruf des Konstruktors (Log-Objekte sind global) die CFG-Datei noch nicht gelesen ist. Dies muss daher durch Aufruf der init()-Funktion nachgeholt werden.
fname | Name der zu schreibenden Log-Datei |
channels | eingeschaltete Kanaele (Bitmuster) |
maxLogLen | maximal erlaubte Laenge der Log-Datei in Bytes |
fileToLog | Quell-Code-Datei, die ausschliesslich geloggt werden soll; wenn "", dann werden alle Quell-Code-Dateien geloggt |
progName | Name der Applikation (nur fuer Titelzeile der Log-Datei) |
version | Version der Applikation (nur fuer Titelzeile der Log-Datei) |
|
private |
Benennt die Logdatei *.txt in *.bak um und loescht zuvor eine aeltere *.bak-Datei, falls vorhanden.
|
static |
Wandelt channels ch in einen String um.
ch | Kanaele (Bitmuster), die in einen String gewandelt werden sollen |
bool Log::configured | ( | int | channels, |
const char * | srcFileP, | ||
int | lineNr | ||
) |
Prueft, ob die geforderten Kanaele ueberhaupt "eingeschaltet" sind und die Groesse des Logfiles.
Wenn zu gross, wird BAK-Datei angelegt. Ausserdem wird der Header der Zeile, bestehend aus Uhrzeit, Dateiname und Zeilennummer generiert und als erstes Element der Zeile ausgegeben.
channels | Kanaele (Bitmuster), in die geschrieben werden soll |
srcFileP | Zeiger auf Name der Quell-Code-Datei (aus Makro FILE) |
lineNr | Zeilennummer des Logging-Kommandos (aus Makro LINE) |
|
static |
Gibt String mit dem aktuellen Datum der Systemuhr im Format "Wed Dec 21 2000" zurueck.
|
static |
Gibt die Systemuhrzeit als String im Format "hh:mm:ss" zurueck.
int Log::init | ( | const string & | fname, |
int | channels, | ||
int | maxLogLen, | ||
const string & | fileToLog, | ||
const string & | progName, | ||
const string & | version | ||
) |
Initialisiert die Dateinamen und Channels.
Kann nicht im Konstruktor gemacht werden, da beim Aufruf des Konstruktors (Log-Objekte sind global) die CFG-Datei noch nicht gelesen ist. Es ist moeglich, alle Log-Objekte mit derselben Datei zu verknuepfen. Dazu wird geprueft, ob eine Datei mit gleichem Namen schon vorher geoeffnet wurde. Daher ist die Reihenfolge beim Initialisieren wichtig! Zuerst muss die Online-Log-Datei geoeffnet werden, damit mit den Membervariablen verglichen werden kann.
fname | Name der zu schreibenden Log-Datei |
channels | eingeschaltete Kanaele (Bitmuster) |
maxLogLen | maximal erlaubte Laenge der Log-Datei in Bytes |
fileToLog | Quell-Code-Datei, die ausschliesslich geloggt werden soll; wenn "", dann werden alle Quell-Code-Dateien geloggt |
progName | Name der Applikation (nur fuer Titelzeile der Log-Datei) |
version | Version der Applikation (nur fuer Titelzeile der Log-Datei) |
void Log::stopLogging | ( | ) |
Schliesst Datei und loescht den allokierten ofstream.
Problematisch ist die Sache, wenn gemeinsame Log-Dateien fuer Online-, Debug- und/oder Error-Logging benutzt werden. Dann sind naemlich die Pointer mFstreamP in allen drei Objekten gleich, das zuerst aufgerufene stopLogging() wuerde aber schon fuer alle Objekte den ofstream entfernen, so dass beim zweiten Objekt mFstreamP->close() einen Speicherfehler verursachen wuerde. Daher muss verglichen werden, ob in einem anderen Log-Objekt derselbe Pointer benutzt wird und dieser dann auch gleich genullt werden.
|
static |
Wandelt String str in channels um.
str | String mit den Kanalbezeichnungen |
|
private |
Schreibt Datei-Header.
Format z.B.: