Advanced Java Services | 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.
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.
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); }
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.