Java: Howto Logging mit Log4j

Logging in Java mit Log4jWas braucht jede Anwendung (egal ob Web-Anwendung, Batch oder Standalone) und wird meistens vom Entwickler vernachlässigt?! Genau – das Logging. Speziell in Java hat man hier die Qual der Wahl: Apache Log4j, Apache Commons Logging, Java Util Logging/Java Logging API und wie sie alle heißen. Am Ende muss man sich für eins der Frameworks entscheiden oder man setzt slf4j ein und verzögern damit die Entscheidung. Persönlich habe ich mich für Log4j entschieden und möchte Ihnen in diesem Beitrag eine Möglichkeit zeigen, wie man Log4j in einem Java-Programm verwendet.

 

Grundlage

Um mit Log4j arbeiten zu können, muss die Lib “log4j-1.2.XX.jar” im Projekt eingebunden werden. Diese kann ganz einfach hier heruntergeladen werden.

 

Die Log4j-XML

Zur Konfiguration von Loggern in Log4j verwende ich immer eine XML-Datei. Diese kann nach folgendem Schema aufgebaut werden:

< ?xml version="1.0" encoding="UTF-8" ?>
< !DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

 <!-- ++++++++ -->
 <!-- Appender -->
 <!-- ++++++++ -->
 
 <appender name="SIZE_LOG" class="org.apache.log4j.RollingFileAppender">
  <param name="File" value="log/Size.log" />
  <param name="MaxFileSize" value="10MB" />
  <param name="Append" value="true" />
  <param name="Threshold" value="ALL" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
  </layout>
 </appender>

 <!-- ++++++ -->
 <!-- Logger -->
 <!-- ++++++ -->
 
 <logger name="de.axxg.log4j" additivity="false">
  <level value="ALL" />
  <appender -ref ref="SIZE_LOG" />
 </logger>
</log4j:configuration>

Generell besteht ein Logger aus einem Namen und einem Appender. Der Name sollte immer dem Basis-Package der Anwendung entsprechen! Diese Konvention macht es einfacher einen Logger im Code zu initialisieren. Der Appender definiert folgendes:

  • wie geloggt wird (Zeile 9: class-Attribut)
    • RollingFileAppender – bei einer bestimmten Dateigröße eine neue Log-Datei anlegen
    • DailyRollingFileAppender – jeden Tag eine neue Log-Datei anlegen
  • wo geloggt wird (Zeile 10)
  • und in welcher Form. (Zeile 15)

 

Das Pattern

Diese Patterns produzieren folgende Ausgaben:

  • %d [%t] %-5p %c – %m%n
    • 2012-03-14 16:04:24,786 [main] INFO de.axxg.log4j.Main – Hallo myLog!
    • 2012-03-14 16:04:24,786 [main] INFO de.axxg.log4j.AndereKlasse – Hallo myLog von hier!
  • %d %-5p [%c{1}] %m%n
    • 2012-03-14 16:04:24,786 [main] INFO root – Hallo myRootLog!
    • 2012-03-14 16:04:24,786 [main] INFO root – Hallo myRootLog von hier!

Folgende Optionen sind meiner Meinung nach noch wichtig:

c Category: Kategorie = Name org.apache
C Class = Klassennamen
d Datum mit Pattern Beispiel: %d{HH:mm:ss,SSS}
F Filename
l Location. Aufrufende Methode, Quelle, Dateiname und Zeilennummer
L Line number
m Die eigentliche Meldung
M Methodennamen
n Line-Separator (Plattformabhängig)
p Priorität: DEBUG, INFO, WARN, usw.
r Anzahl der Millisekunden seit dem Start der VM
t Name des Threads

 

Die Java-Klasse

Innerhalb der Java-Anwendung muss einmalig der DOM konfiguriert werden. Dies kann man z.B. in einem Static-Block, in der Main-Methode oder in einer Konfigurationsklasse tun. Mittels der “configureAndWatch”-Methode wird aller 60 Sekunden geprüft, ob sich die Konfiguration geändert hat. Diese Methode ist erst seit Log4j Version 1.2.14 verfügbar!

import org.apache.log4j.xml.DOMConfigurator;

    static {
     // darf und muss nur einmalig ausgeführt werden!
     String path;
      path = "resources/log4j.xml";
         DOMConfigurator.configureAndWatch(path);
     }

Zum Schluss muss man lediglich die Logger initialisieren und mit den entsprechenden Level aufrufen:

     Logger mylog = Logger.getLogger(Main.class.getName());
     Logger mylogR = Logger.getRootLogger();
     
     mylog.info("Hallo myLog!");
     // verschiedene Loglevel!
     mylogR.debug("Hallo myRootLog!");
     mylogR.info("Hallo myRootLog!");
     mylogR.warn("Hallo myRootLog!");
     mylogR.fatal("Hallo myRootLog!");

Achtung – Statt “Main” wird in der Zeile 1 der entsprechende Klassenname eingesetzt!

 

Coole Feature

Der Grund, warum ich Log4j mit einer externen Config-XML-Datei nutze, ist folgender:

  • Man kann das Loglevel bestimmen
  • Man kann den Appender austauschen
  • Man kann das Log-Pattern ändern
  • Man kann den Log-Pfad ändern

und das alles, während der Laufzeit ohne REDEPLOY!!! Der Nachteil hingegen ist:

  • Man kann nicht dynamisch zur Laufzeit neue Logger/Appender erzeugen

 

Beispiel

Ein funktionierendes Beispiel befinden sie hier:

Logging in Java mit Log4j

 

Nützliche Seiten

 

Bildquelle

  • Christian Seidel – pixelio.de

 

Copyright © 2012 AxxG – Alexander Gräsel



Kommentar verfassen