Logging

Beim Logging protokolliert ClassiX® verschiedene Zustände, Fehlermeldung, Tätigkeiten usw. mit und schreibt diese in einem bestimmten Format in ein bestimmtes Medium, z.B. in eine Datei.

Eine log4j-kompatible Logging-Bibliothek übernimmt hier den technischen Part.

Die Konfigurationsdatei befindet sich im System-Verzeichnis des ClassiX®-Systems (siehe CX_SYSTEM) und heißt logging.ini. Der Dateiname kann über die Kommandozeile oder per Umgebungsvariable verändert werden:

Die Umgebungsvariable hat die höchste Priorität.

Die Konfigurationsdatei besteht aus zwei Teilen: Den Loggern und den Ausgabemedien. Im folgenden Beispiel sind zwei Logger beschrieben, die in ein Ausgabemedium (eine Datei) schreiben:

log4cplus.rootLogger=INFO, FILE_LOGGER

log4cplus.appender.FILE_LOGGER=log4cplus::RollingFileAppender
log4cplus.appender.FILE_LOGGER.File=${CX_LOGFILENAME}.log
log4cplus.appender.FILE_LOGGER.ImmediateFlush=true
log4cplus.appender.FILE_LOGGER.Append=true
log4cplus.appender.FILE_LOGGER.MaxFileSize=1MB
log4cplus.appender.FILE_LOGGER.MaxBackupIndex=5
log4cplus.appender.FILE_LOGGER.layout=log4cplus::PatternLayout
log4cplus.appender.FILE_LOGGER.layout.ConversionPattern=%D{%Y-%m-%d %H:%M:%S,%%q} %5p %c - %m%n

log4cplus.logger.cx.main=ALL

Logger

Ein Logger ist ein Objekt, das alle Meldungen einer bestimmten Kategorie (und deren Unterkategorien) sammelt und in ein oder mehrere Medien schreibt. Die Meldungen kommen vom ClassiX®-System selbst, über SystemObject::Log können aber auch selbst solche Meldungen erzeugt werden.

Im Beispiel wird der Ur-Logger "rootLogger" mit dem Level INFO und dem Medium FILE_LOGGER konfiguriert. Alle anderen Logger sind von "rootLogger" abgeleitet, erben also dessen Eigenschaften. ClassiX®-Logger beginnen üblicherweise mit "cx.".

Die Meldungen "Programmstart" und "Programmende" z.B. werden dem Logger "cx.main" zugestellt. Damit diese immer im Logbuch erscheinen, wird der Logging-Level auf ALL hochgestuft.

Logger Bedeutung
cx.app Allgemeine Meldungen der Applikation, z.B. Fehlermeldungen oder Meldungen via CX_SYSTEM_OBJECT::Log
cx.arena Meldungen der Arena (Speicherverwaltung)
cx.as Meldungen der Address-Space Verwaltung (Marker)
cx.basic Meldungen der Basisklassen bzw. der Basis-Infrastruktur
cx.basic.fcond  
cx.basic.formula  
cx.basic.numeric  
cx.basic.string  
cx.basic.unit  
cx.birt Informationen zur Benutzung von Birt als Reporting-Tool
cx.gc Garbage-Collection-Läufe (siehe auch CX_GARBAGE_LOGGING_THRESHOLD)
cx.instantview InstantView®-Meldungen, z.B. doppelt definierte Variablen oder Messages
cx.instantview.parser Meldungen des InstantView®-Parsers
cx.lic Meldungen des Lizenzmanagers
cx.listview Meldungen der ListView
cx.locale Meldungen zu den Locales
cx.main Meldung über Programmstart und -ende, laden von DLLs
cx.model Informationen zu allgemeinen Model-Klassen. Wird weiter unterteilt nach spezifischen Model-Klassen.
cx.model.dict Dictionaries und Indexes loggen unter diesem Eintrag
cx.model.monitor  
cx.objectbrowser Meldungen des Objectbrowsers
cx.ole Logging zu den OLE-, COM-, ActiveX-relevanten Klassen. OLE-Widgets loggen unter cx.ui.ole
cx.omgr Meldungen des Objekt-Managers
cx.omgr.db Öffnen der Datenbanken
cx.omgr.osversion ObjectStore-Version und eigene ObjectStore-ID
cx.perf Performance logging
cx.perf.iv Performance informationen bezgl. Instantview-Statements.
Im DEBUG-Level wird zu jedem Statement ein Eintrag erzeugt, das Logfile wächst dann also sehr schnell.
Im INFO-Level werden die Zeiten gesammelt und je nach Einstellung von CX_PERF_LOGGING_THRESHOLD_PAGE und CX_PERF_LOGGING_THRESHOLD_TIME geloggt.
cx.perf.db Performance informationen bezgl. Datenbank (ggw. nicht verwendet)
cx.pool Meldungen von Pool (Speicherverwaltung)
cx.print Meldungen von der Druckumgebung (ggw. lediglich ASCII-Druck)
cx.process Hier werden Informationen geloggt wenn ClassiX eine andere Anwendung (einen anderen Prozess) startet.
cx.query Query-relevante Meldungen
cx.remote Meldungen der Remote-Schnittstellen (z.B. CORBA)
cx.remote.corba CORBA bezogene Meldungen der Remote-Schnittstelle
cx.remote.data Meldungen bezgl. über die Remote-Schnittstelle gesendeter und empfangener Daten
cx.rqdsp Request-Dispatcher-Meldungen (Befehlsausführung)
cx.rqdsp.asf Address-Space-Full-Fehler
cx.rqdsp.deadlock Unterkategorie für das Deadlock-Handling
cx.rqdsp.deadlock.rcb Ausgabe der Resume Control Blocks (siehe auch CX_DEBUG_RCB_QUEUE)
cx.rqdsp.time Laufzeiten der InstantView-Makros (siehe auch CX_MACRO_LOGGING_THRESHOLD)
cx.tapi Debugging Informationen zur TAPI (Telephone API) Schnittstelle
cx.test Test-Meldungen
cx.threading Informationen zum Threadingverhalten von ClassiX
cx.threading.timetrigger CX_TIMED_TRIGGER schreibt Informationen zu seinen Events
cx.threading.critsec Meldungen, wenn CriticalSections benutzt werden
cx.txn Transaction-Manager (Monitor für Datenbank-Transaktionen) (siehe auch CX_TXN_LOGGING_THRESHOLD)
cx.ui Meldungen betreffs der Oberfläche. Wird weiter unterteilt nach Widgettypen
cx.ui.group  
cx.ui.listview  
cx.ui.oboxedit  
cx.ui.ole  
cx.ui.olecontrol  
cx.ui.notebook  
cx.ui.tray Meldungen des Trays
cx.ui.treeview  

Log-Level-Einstellungen eines Loggers gelten immer auch für den untergeordneten Logger (es sei denn, für diesen untergeordneten wird der Level wieder umdefiniert):

log4cplus.logger.cx=INFO                    # Für alle ClassiX®-Logger: INFO-Level
log4cplus.logger.cx.instantview=WARN        # InstantView®-Meldungen: Nur Warnungen und Fehler
log4cplus.logger.cx.rqdsp=ERROR             # Request-Dispatcher: Nur Fehler, ...
log4cplus.logger.cx.rqdsp.deadlock=WARN     # ... aber bei Deadlock-Meldungen auch Warnungen

Medien

Jede Logging-Zeile kann in mehrere Medien ausgegeben werden. Z.Zt. werden folgende Medien unterstützt:

ClassiX® legt von sich aus die Umgebungsvariable CX_LOGFILENAME an, die einen Standard-Dateinamen inkl. Pfad enthält. Der Pfad entspricht dem System-Verzeichnis von ClassiX®, der Dateiname beginnt mit CX_, gefolgt vom Rechnernamen, Benutzernamen und Prozeß-ID, Endung ist .log.
Falls die Umgebungsvariable CX_LOGFILENAME bereits gesetzt ist, wird sie für den laufenden ClassiX-Prozess überschrieben.
Um den Dateinamen der Log Datei manuell zu vergeben muss in der logging.ini der Eintrag entsprechend angepasst werden.

log4cplus.appender.FILE_LOGGER.File=${MY_FILE_NAME}.log       

Davon ist allerdings dringend abzuraten, da dann alle Events in nur eine Datei geschrieben werden, was eine Zuordnung zu einem Benutzer erschwert. Allerdings kann an dieser Stelle auf jede beliebige Umgebungsvariable zugegriffen werden, z.B. ${COMPUTERNAME} oder ${USERNAME}.

Layout

Logging-Zeilen können individuell gestaltet werden (s. log4j-Dokumentation für Details):

Zeichen Bedeutung
%D, %d Zeitstempel (%D = lokale Zeit, %d = UTC)
  %Y, %y Jahr (4- bzw. 2-stellig)
  %m Monat
  %d Tag
  %H Stunde
  %M Minute
  %S Sekunde
  %%q Millisekunde
%p Level
%c Kategorie
%m Text
%n Zeilenumbruch

Level

Es gibt fünf verschiedene Level-Stufen:

Level Beschreibung
TRACE Feinste Stufe, z.T. werden einzelne Funktionsaufrufe geloggt
DEBUG Sehr detaillierte Informationen, die zur technischen Fehlersucht genutzt werden können
INFO Allgemeine Informationen
WARN Warnungen
ERROR Fehler
FATAL Höchste Stufe: Fehler, der zum Programmabbruch führt

Wird in der logging.ini ein bestimmter Level eingestellt, werden alle Meldungen protokolliert, die diesen Level oder einen höheren haben. ALL bedeutet außerdem alle Meldungen, OFF bedeutet keine Meldungen.