Log4J PatternLayout – Log Statement Konfiguration

Wer mit Log4J arbeitet konfiguriert die Ausgabe eines einzelnen Log Statements mit der Angabe des Layouts. Log4J unterscheidet hier zwischen fünf Layout Varianten: DateLayout, HTMLLayout, PatternLayout, SimpleLayout und XMLLayout. Die wohl mit am meisten verwendete Layout Variante ist das PatternLayout. Um das PatternLayout zu verwenden muss man noch das Pattern (Formatierungsvorlage) der Ausgabe unter Verwendung von ConversionPattern konfigurieren. So sieht eine solche Konfiguration z.B. wie folgt aus:

<layout class="org.apache.log4j.PatternLayout">
  <param name="ConversionPattern" value="%d %-5p [%c{1}] %m%n"/>
</layout>

Problem bei dieser Geschichte ist, dass man einen mehr oder weniger kryptischen ConversionPattern angibt (z.B. %d %-5p [%c{1}] %m%n) und dabei natürlich wissen sollte wie das Ergebnis aussieht bzw. aussehen sollte. Ich habe Google angeschmissen um mal schnell ein paar Layoutbeispiele zu finden wurde aber nicht wirklich direkt fündig. Somit soll die folgende Tabelle mit den verschiedenen Konfigurationsmöglichkeiten für das PatternLayout ein wenig Übersicht bringen.

Konfigurationsmöglichkeiten für das PatternLayout – “Conversion Character”
Beschreibung Pattern Details/Ausgabe
Datum %d Default Datum

2008-11-16 17:12:51,825
Datum Details %d{dd.MM HH:mm} Formatiertes Datum – in diesem Fall das Datum ohne Jahreszahl und nur Stunden und Minuten:

16.11 17:24
Log Level %p Kann die Werte TRACE, DEBUG, INFO, WARN, ERROR und FATAL enthalten:

DEBUG …
INFO …
DEBUG …
Ausgabeformat %-5p %-5 bedeutet, dass die Ausgabe immer mindestens 5 Zeichen lang sein soll. Somit ist die Länge der Log Level Ausgabe immer gleich:

591 DEBUG [Component] …
591 INFO  [Component] …
591 DEBUG [Events] …
591 WARN  [Events] …
Package/Kategorie %c
org.jboss.seam.Component
Package/Kategorie %c{1} Die Tiefe der Packages kann so konfiguriert werden. Dabei wird von der Klasse aus das Zählen angefangen: %c{1} bedeutet Tiefe 1:

Component

%c{2} somit die Tiefe 2:

seam.Component

Lässt man die Tiefe weg erhält man immer die komplette Package Angabe, wie in der Zeile zuvor gezeigt wird.

Location Information %l Anstatt der Möglichkeit die Packages/Kategorien im Einzelnen zu konfigurieren kann man auch einfach die komplette Location Information mit dem Pattern %l ausgeben:

org.jboss.seam.security.Identity.login(Identity.java:274)

Es wird der Klassenname mit Package und Methode ausgegeben sowie die Zeile in der Java Source Datei. Gerade für Analysen sehr nützlich.
Es sollte allerdings bedacht werden, dass die Erstellung dieser Information sehr langsam ist und somit die Geschwindigkeit der Anwendung deutlich verlangsamen kann.

Source Datei, Methodenname, Zeilennummer %F, %M, %L Anstatt der komplette Location Information benötigt man manchmal lediglich die Sourcode Datei (%F), den Methodenname (%M) oder die Zeilennummer (%L).
Die entsprechenden Informationen werden dann einzeln ausgegeben wie z.B. folgendes Pattern [%F] [%M] [%L]:

[Identity.java] [login] [274]

Auch hier gilt, dass es aufwendig ist diese Information zu erhalten und dadurch die Anwendung deutlich langsamer werden kann.

Prozentzeichen %% Und wenn man mal das Prozentzeichen benötigt einfach mit dem %-Zeichen escapen =)

Ich persönlich finde nach der hier vorliegenden Erklärung folgendes Pattern ziemlich brauchbar:

%d{dd.MM.yyyy HH:mm:ss,SSS} %-5p [%c] %m%n

Welches die Ausgabe im Logfile wie folgt formatiert:

16.11.2008 18:25:14,852 INFO  [de.javathreads.log4jtest.session.Authenticator] Authentifiziere user: admin
16.11.2008 18:25:14,853 DEBUG [org.hibernate.SQL]
    select
        jtuser0_.ID as ID122_,
        jtuser0_.VERSION as VERSION122_,
        jtuser0_.NAME as NAME122_,
        jtuser0_.PASSWORT as PASSWORT122_,
        jtuser0_.LASTLOGIN as LASTLOGIN122_
    from
        JT_USER jtuser0_
    where
        jtuser0_.NAME=?
17.11.2008 18:25:14,853 TRACE [org.hibernate.type.StringType] binding 'admin' to parameter: 1
17.11.2008 18:25:14,855 TRACE [org.hibernate.type.LongType] returning '5' as column: ID122_
17.11.2008 18:25:14,855 TRACE [org.hibernate.type.IntegerType] returning '0' as column: VERSION122_

Viel Spass beim Formatieren der Log Ausgabe ;)

Tags: ,

Wenn du Fragen oder Anregungen zum Post hast, dann hinterlasse doch einen Kommentar oder wenn du weiterhin Artikel von Javathreads lesen möchtest, dann abonniere den RSS Feed und sehe direkt in deinem Feed Reader die nächsten Artikel.

Ähnliche Artikel, die dich interessieren könnten:
Kommentare

Ich verwende nur noch logback (http://logback.qos.ch/) in Kombination mit slf4j (http://www.slf4j.org)
Logback hat z.B. eine Möglichkeit das lästige
if (logger.isDebugEnabled()) {…}
zu umgehen. Dann noch die schönen includes, mit denen man die eigentliche Konfig außerhalb des Classpath lassen kann.
Und nicht zu vergessen die JMX Schnittstellt.
Trotzdem: Mal wieder ein guter Artikel!

Danke =)
Ich muss mir Logback und SLF4J ja so langsam doch mal genauer ansehen. Kommt mir immer öfter unter..
Also vielen Dank für den Hinweis!

[...] Javathreads gelesen und passend zu meinem Log4j Beitrag. Bei Aktivierung der Log4J  Ausgabe ist schnell die [...]

Hinterlasse einen Kommentar