- log4j
-
log4j Maintainer Ceki Gülcü, C. Arnold Entwickler Apache Software Foundation Aktuelle Version 1.2.16
(6. April 2010)Betriebssystem plattformunabhängig Programmiersprache Java Lizenz Apache-Lizenz 2.0 logging.apache.org/log4j log4j ist ein Framework zum Loggen von Anwendungsmeldungen in Java. Innerhalb vieler Open-Source- und kommerzieller Softwareprodukte hat es sich über die Jahre zu einem De-facto-Standard entwickelt. log4j gilt als Vorreiter für andere Logging-Frameworks, auch in anderen Programmiersprachen.
Inhaltsverzeichnis
Geschichte
Das Projekt wurde von Ceki Gülcü 1996 während seiner Arbeit am IBM-Entwicklungslabor in Zürich gegründet. Heute ist es ein Teil des Logging-Projekts der Apache Software Foundation und steht unter der Apache-Lizenz 2.0. Es entstand zu einer Zeit, als es in den Java-Standardbibliotheken noch keine Logging-Mechanismen gab. Heutzutage ist es durch seine Ausgereiftheit und Konfigurierbarkeit für viele Softwareentwickler das Log-System der ersten Wahl.
Die Ausstrahlung der log4j-Konzepte auf andere Programmiersprachen bzw. Plattformen ist so groß, dass es mittlerweile etliche Adaptionen gibt:
- log4C für C
- log4cxx für C++ mit zu Log4J kompatiblen Konfigurationsdateien
- log4cplus für C++
- log4cpp für C++
- Log4Qt für Qt
- Log4js für JavaScript
- log4perl für Perl
- log4Net für .Net
- log4php für PHP
- log4D für Delphi
- log4sh für Unix-Shells
- log4plsql für Oracle PL/SQL
- log4sas für SAS Institute
- Modul logging für Python [2]
Das Apache-Logging-Projekt versucht log4j-ähnliche Systeme für diverse Programmiersprachen zusammenzuführen. Bisher sind das log4j, log4cxx, log4net, Chainsaw (ein Logdatei-Betrachter und -Analysewerkzeug) und log4php[1]. [2]
Funktionsweise
Anstatt auftretende Fehler und Infomeldungen auf der Standardausgabe auszugeben, dient log4j dazu, die Meldungen über sogenannte Logger an das gewählte Loggingsystem weiterzuleiten. Neben der Auswahl des Loggingsystems wird gleichzeitig auf Grund der Wichtigkeit der Meldung entschieden, ob diese überhaupt weitergeleitet wird. Der Programmierer muss sich beim Erstellen des Programms nur um die Wichtigkeit der Meldungen Gedanken machen. Die Filterung und Art der Ausgabe kann zur Laufzeit konfiguriert werden.
Log4j ist auf möglichst hohe Geschwindigkeit ausgelegt, damit das Loggen die Systemleistung nicht negativ beeinflusst. So dauert die Entscheidung, ob eine Meldung ausgegeben werden muss, auch auf einem veralteten System (AMD Duron mit 800 Mhz, JDK 1.3.1) nur 5 Nanosekunden, die Ausgabe selbst – je nachdem welches Layout verwendet wird – zwischen 21 und 27 Mikrosekunden.[3]
Ausgabe-Umfang
In der Konfigurationsdatei kann die Ausgabe je nach Wichtigkeit der Nachrichten gefiltert werden. Der Ausgabe-Umfang steigt mit der zugewiesenen Wichtigkeitsstufe und umfasst alle Nachrichten der Stufe selbst, sowie aller noch dringenderen Stufen. Die Reihenfolge stellt sich dabei wie folgt dar:
ALL > TRACE > DEBUG > INFO > WARN > ERROR > FATAL > OFF
Für die Einstufung der Wichtigkeit gelten folgende Richtwerte:
- ALL
- Alle Meldungen werden ungefiltert ausgegeben
- TRACE
- ausführlicheres Debugging (seit Version 1.2.12), Kommentare
- DEBUG
- allgemeines Debugging (Methode DiesUndDas wurde mit Parameter SoUndSo aufgerufen …)
- INFO
- allgemeine Informationen (Programm gestartet, Programm beendet, Verbindung zu Host Foo aufgebaut, Verarbeitung dauerte SoUndSoviel Sekunden …)
- WARN
- Auftreten einer unerwarteten Situation
- ERROR
- Fehler (Ausnahme wurde abgefangen. Bearbeitung wurde alternativ fortgesetzt)
- FATAL
- Kritischer Fehler, Programmabbruch
- OFF
- Logging ist deaktiviert
Appender
Mittels Appender kann je nach Wunsch auf Standardausgabe, in eine Datei, ins Systemlog, in eine Datenbank oder in beliebige andere Ziele geschrieben werden bzw. in alle gleichzeitig.
Die folgenden sind die wichtigsten Appender-Arten:
- ConsoleAppender
- Gibt auf Standardausgabe aus
- FileAppender
- Schreibt in eine Datei
- RollingFileAppender
- Beginnt eine neue Datei ab einer gewissen Größe
- DailyRollingFileAppender
- Beginnt zu gewissen Zeiten mit einer neuen Datei
- SyslogAppender
- Loggt mittels Syslog-Dienst
- JDBCAppender
- Schreibt in eine Datenbank
- NTEventLogAppender
- Schreibt ins Ereignisprotokoll des Windows-Systems
- SMTPAppender
- Schickt bei gewissen Meldungen eine Mail.
- SocketAppender
- Sendet die Log-Nachricht an einen konfigurierten Socket-Listener.
Weitere Appender können jederzeit hinzugefügt werden.
Konfiguration
Es gibt zwei Arten, um log4j zu konfigurieren: mittels einer Eigenschaften- oder mittels einer XML-Datei. Damit ist die Konfiguration vom Code getrennt, was es ermöglicht, ohne Modifikation oder Neustart der Applikation das Loggen umzukonfigurieren. Somit kann beispielsweise eine Applikation so lange nur mit Log-Level FATAL betrieben werden, bis ein Fehler auftritt. Ab dann wird das Level WARN gesetzt, ohne die Applikation anzuhalten.
Die Konfigurationsdateien definieren mittels der folgenden Komponenten das Verhalten von log4j:
- Appender
- Diese bestimmen mittels Konfiguration der entsprechenden Appender-Klasse, wohin die Log-Ausgaben geschrieben werden sollen, und mittels Konfiguration des Layouts, wie dorthin geschrieben werden soll. Neben der reinen Nachricht können mittels Muster zusätzlich Wichtigkeit, Datum, Loggername, Klassenname und Methodenname bis hin zur genauen Codezeile ausgegeben werden.
- Logger
- Dabei handelt es sich um Logger-Namen, welche von der Applikation benutzt werden. Üblicherweise werden in der Konfigurationsdatei Logger für ganze (Super-)Pakete beschrieben, in der Applikation selbst wird mittels
Logger.getLogger(java.lang.Class)
der entsprechende Logger anhand des Klassen- und Paketnamens bestimmt. Damit können die Ausgaben entsprechend der Softwarestruktur separat gefiltert und ausgegeben werden. - In der Konfigurationsdatei wird neben den Namen der Logger auch deren Log-Level gesetzt. Damit ist es möglich, unterschiedlichen Paketen und somit unterschiedlichen Komponenten verschiedene Log-Level zu geben.
- Darüber hinaus können entweder allgemein oder auch zu jedem Logger spezifisch ein oder mehrere Appender definiert werden. Somit ist es beispielsweise möglich, fatale Fehler nicht nur in eine Datei zu schreiben, sondern auch gleichzeitig per E-Mail an einen Administrator zu schicken.
Ein weiteres nützliches Merkmal ist der Mapped Diagnostic Context. Dabei wird einer Kontextvariablen ein Wert zugewiesen und in der Konfigurationsdatei kann darauf referenziert werden. Dabei hat jeder Thread seinen eigenen Kontext und kann zusätzliche Informationen wie z. B. die Adresse des Clients bei einer Serveranwendung protokollieren.
Beispiel
Die folgende XML Konfiguration konfiguriert eine Applikation so, dass FATAL-Fehler von Fremdbibliotheken auf die Konsole geloggt werden, ERROR-Fehler der eigenen Applikation zusätzlich auch per E-Mail geschickt werden, bei einer spezifischen Komponente darüber hinaus auch noch INFO-Meldungen geloggt werden und bei einer bestimmten Klasse sogar noch DEBUG-Meldungen.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"> <log4j:configuration> <!-- Appender für eine einzeilige Ausgabe an der Konsole --> <appender name="Konsole" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" /> </layout> </appender> <!-- Appender für dieselbe Ausgabe via email --> <appender name="mail" class="org.apache.log4j.net.SMTPAppender"> <param name="SMTPHost" value="smtp.myservername.xx" /> <param name="From" value="email@fromemail.xx" /> <param name="To" value="toemail@toemail.xx" /> <param name="Subject" value="[LOG] ..." /> <param name="BufferSize" value="1" /> <param name="threshold" value="error" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" /> </layout> </appender> <!-- ERROR-Logger für alle Klassen meiner Applikation --> <logger name="com.myapp"> <level value="error"/> <appender-ref ref="Konsole" /> <appender-ref ref="mail" /> </logger> <!-- INFO-Logger für eine spezifische Komponente --> <logger name="com.myapp.mycomponent"> <level value="info"/> </logger> <!-- DEBUG-Logger für eine spezifische Klasse --> <logger name="com.myapp.mycomponent.MyClass"> <level value="debug"/> </logger> <!-- FATAL-Logger für die gesamte Applikation (inkl. Bibliotheken) --> <root> <level value="fatal" /> <!-- loggt auf Konsole - wenn nicht in Sub-Loggern anders definiert --> <appender-ref ref="Konsole" /> </root> </log4j:configuration>
Alternativen
- Java Logging – seit Java 1.4 Bestandteil der Java-Klassenbibliothek; ähnlich zu log4j, weniger Handler, kein PatternLayout
- Apache Commons Logging – Schnittstelle für beliebig austauschbare Logging-Frameworks, unter anderem log4j
Weblinks
- log4j-Webseiten (engl.)
- log4j-Wiki (engl.)
- Logging mit Log4j – Einführung von Torsten Horn
- Log4j Einführung mit Tomcat-Beispielen von Sebastian Hennebrueder
Literatur
- Samudra Gupta, Pro Apache Log4j, Apress, 22. Juni 2005, ISBN: 978-1590594995, http://www.apress.com/book/view/9781590594995
- Ceki Gulcu, The Complete Log4j Manual, QOS.ch, 7. Mai 2003, ISBN: 978-2970036906, https://www.qos.ch/shop/products/log4j/log4j-Manual.jsp
Einzelnachweise
Kategorien:- Java-Bibliothek
- Freie Software
Wikimedia Foundation.