Almetare  1.15
Alle meine Taschenrechner - Eine C++-Bibliothek zur Entwicklung von Taschenrechnern
Log Klassenreferenz

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)
 

Ausführliche Beschreibung

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

------------------------------------------------------------------------------
Casio fx-85v (V.1.0 beta) logfile 'log.txt' opened at Sat Sep 28 2002
------------------------------------------------------------------------------
21:12:01: calc_dlg_base.c?, 503, gnl: button '5' mapped to symbol '5'
21:12:02: calc_dlg_base.c?, 503, gnl: button '2' mapped to symbol '2'
21:12:02: calc_dlg_base.c?, 503, gnl: button 'Mul' mapped to symbol '*'
...

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;

Beschreibung der Konstruktoren und Destruktoren

◆ Log()

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.

Parameter
fnameName der zu schreibenden Log-Datei
channelseingeschaltete Kanaele (Bitmuster)
maxLogLenmaximal erlaubte Laenge der Log-Datei in Bytes
fileToLogQuell-Code-Datei, die ausschliesslich geloggt werden soll; wenn "", dann werden alle Quell-Code-Dateien geloggt
progNameName der Applikation (nur fuer Titelzeile der Log-Datei)
versionVersion der Applikation (nur fuer Titelzeile der Log-Datei)

Dokumentation der Elementfunktionen

◆ backupLogFile()

int Log::backupLogFile ( )
private

Benennt die Logdatei *.txt in *.bak um und loescht zuvor eine aeltere *.bak-Datei, falls vorhanden.

Rückgabe
0, wenn OK; -1, wenn der Filestream gar nicht offen ist; -2, wenn sich ein aelteres Log-File nicht entfernen laesst; -3, wenn sich das alte File nicht in *.bak umbenennen laesst;

◆ channelsToStr()

string Log::channelsToStr ( int  ch)
static

Wandelt channels ch in einen String um.

Parameter
chKanaele (Bitmuster), die in einen String gewandelt werden sollen
Rückgabe
String mit allen Konfigurierten Kanaelen

◆ configured()

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.

Parameter
channelsKanaele (Bitmuster), in die geschrieben werden soll
srcFilePZeiger auf Name der Quell-Code-Datei (aus Makro FILE)
lineNrZeilennummer des Logging-Kommandos (aus Makro LINE)
Rückgabe
false, wenn einer der gewuenschten Kanaele eingeschaltet ist und die Ausgabe nicht unterdrueckt wird (kommt z.B. vor, wenn stopLogging() aufgerufen wurde), sonst true

◆ getDate()

string Log::getDate ( )
static

Gibt String mit dem aktuellen Datum der Systemuhr im Format "Wed Dec 21 2000" zurueck.

Rückgabe
String mit dem Datum

◆ getTime()

string Log::getTime ( )
static

Gibt die Systemuhrzeit als String im Format "hh:mm:ss" zurueck.

Rückgabe
String mit der Uhrzeit

◆ init()

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.

Parameter
fnameName der zu schreibenden Log-Datei
channelseingeschaltete Kanaele (Bitmuster)
maxLogLenmaximal erlaubte Laenge der Log-Datei in Bytes
fileToLogQuell-Code-Datei, die ausschliesslich geloggt werden soll; wenn "", dann werden alle Quell-Code-Dateien geloggt
progNameName der Applikation (nur fuer Titelzeile der Log-Datei)
versionVersion der Applikation (nur fuer Titelzeile der Log-Datei)
Rückgabe
0, wenn OK; -1, wenn sich Datei nicht anlegen laesst; -2, wenn sich der Filestream nicht oeffnen laesst.

◆ stopLogging()

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.

◆ strToChannels()

int Log::strToChannels ( const string &  str)
static

Wandelt String str in channels um.

Parameter
strString mit den Kanalbezeichnungen
Rückgabe
Integer mit den Kanaelen (Bitmuster)

◆ writeHeader()

void Log::writeHeader ( )
private

Schreibt Datei-Header.

Format z.B.:

----------------------------------------------------------------------------
Casio fx-85v (V.1.0 beta) logfile 'log.txt' opened at Sat Sep 28 2002
----------------------------------------------------------------------------

Die Dokumentation für diese Klasse wurde erzeugt aufgrund der Dateien: