Advanced   Java   Services Logdateien mit log4j erstellen Back Next Up Home


Logdateien mit log4j erstellen

Ein nützliches Werkzeug zum Debuggen ist das von Apache zur Verfügung gestellte Tool log4j. Nähere Information findet man unter logging.apache.org/log4j/1.2. Der Link zum Download des Java-Archivs ist logging.apache.org/log4j/1.2/download.html. Man kann log4j mit einer xml-Datei oder mit einer properties-Datei konfigurieren. Die Konfiguration mit einer properties-Datei ist etwas einfacher. Hier eine Beispielkonfiguration.


Beispiel einer properties-Datei
log4j.rootCategory=DEBUG, file, stdout

log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.file=C:/eclipse-workspaces/java/_ejb/Servlet-01-HelloWorld/servlet-01-helloworld.log
log4j.appender.file.layout=org.apache.log4j.SimpleLayout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout

# From most to least verbose: TRACE, DEBUG, INFO, WARN, ERROR, OFF

Mit rootcategory gibt man zunächst an wie ausführlich die Meldungen sein soll und abschließend nach dem Komma, wohin die Meldungen gehen sollen. Für diese Einträge muß es dann entsprechende Appender geben, die man anschließend konfiguriert. Für nähere Einzelheiten konsultiere man das Manual unter logging.apache.org/log4j/1.2/manual.html.


Initialisierung in einem Servlet

In der web.xml wird im Servlettag der Ort der properties-Datei bekanntgegeben.

  <!-- init-Parameter stehen immerhalb eines servlet-tags -->
  <servlet>
    <servlet-name>MyFirstServlet</servlet-name>
    <servlet-class>HelloWorld</servlet-class>
    <init-param>
      <param-name>log4j-file</param-name>
      <param-value>WEB-INF/log4j.properties</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>MyFirstServlet</servlet-name>
    <url-pattern>/hello.php</url-pattern>
  </servlet-mapping>

</web-app>

Diese Parameter kann man in der init()-Methode auslesen. Mit Hilfe von getRealPath("/") wird dann der absolute Pfad ermittelt und dem PropertyConfigurator übergeben.

// in log4j.jar
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public void init(ServletConfig config) throws ServletException
{
  // init-Parameter werden mit Hilfe von ServletConfig aus der web.xml ausgelesen
  String log4jLocation = config.getInitParameter("log4j-file");
  //das file ist entweder log4j.properties oder log4j.xml
  ServletContext sc = config.getServletContext();
  String webAppPath = sc.getRealPath("/");
  String log4jProp = webAppPath + log4jLocation;
  PropertyConfigurator.configure(log4jProp); // (1)
  //Verwendung
  log.info("init");
  super.init(config);
}

Logging statt Debugging

Das oben erwähnte Manual bringt ein Zitat aus dem Buch "The Practice of Programming" von Kernighan und Pike, das ich hier übernehmen möchte:

As personal choice, we tend not to use debuggers beyond getting a stack trace or the value of a variable or two. One reason is that it is easy to get lost in details of complicated data structures and control flow; we find stepping through a program less productive than thinking harder and adding output statements and self-checking code at critical places. Clicking over statements takes longer than scanning the output of judiciously-placed displays. It takes less time to decide where to put print statements than to single-step to the critical section of code, even assuming we know where that is. More important, debugging statements stay with the program; debugging sessions are transient.

top Back Next Up Home