This blog has moved to
http://blog.matthias-reining.com

Die bestehenden Artikel bleiben vorerst alle bei blogspot. Neue Artikel veröffentliche ich allerdings nur noch auf http://blog.matthias-reining.com

Mittwoch, 24. September 2008

Java Logging

Über Logging in Java ist bereits viel geschrieben worden. Das wieso-weshalb-warum erspar ich mir deshalb an dieser Stelle. Im Folgenden eine kurze Einführung wie man in Java loggen kann.

Um die Implementierungen des Loggers später austauschen zu können und um eine Abstraktionsschicht fürs Logging zu integrieren bietet sich die Commons Logging API der Apache Software Foundation an (http://commons.apache.org/logging).

Der Einsatz ist ganz einfach und eigentlich ziemlich ähnlich zu der direkten Implementierung von log4j (http://logging.apache.org/log4j)

package com.mre678.blog.jconsole;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class LoadBuilder {

private static final Log logger = LogFactory.getLog(LoadBuilder.class);

/**
* Load duration in minutes.
*/
private static final short LOAD_DURATION = 60;

public static void main(String... args) {

long startLoad = System.currentTimeMillis();
long endLoad = startLoad + (LOAD_DURATION * 60L * 1000L);

long loops = 0;

if (logger.isInfoEnabled())
logger.info("Starts load builder " + startLoad + "; end " + endLoad);

while (System.currentTimeMillis() < endLoad) {
loops++;
if (logger.isDebugEnabled()) logger.debug("Debug Message");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
logger.error(e);
}
}
if (logger.isInfoEnabled()) logger.info(loops + " loops was executed.");
}
}



Die konkrete Implementierung wird im File commons-logging.properties konfiguriert. Hier beispielsweise log4j.

org.apache.commons.logging.Log = org.apache.commons.logging.impl.Log4JLogger


In diesem kleinen Stand-Alone Beispielprogramm wird 60 Minuten lang jede Sekunde eine log Info Meldung ausgegeben.

Änderung des Loglevels zur Laufzeit

Wäre toll wenn man das Loglevel der Applikation zur Laufzeit ändern kann... Klar geht ganz einfach indem man einfach den Inhalt von log4j.xml während das Java Programm läuft anpasst. Hierzu muss natürlich die log4j Konfiguration mit DOMConfigurator.configureAndWatch eingelesen worden sein (http://logging.apache.org/log4j/1.2/apidocs/index.html?org/apache/log4j/xml/DOMConfigurator.html). Ist aber ja irgendwie uncool. Wäre mit der jconsole von bspw. einem entfernten Rechner schon etwas schicker. Hierzu gibt es bspw. von log4j den JMX Support. Allerdings funktioniert dieser ohne Zutun bei Stand-Alone Applikationen nicht (falls doch würde ich mich über einen kleinen Hinweis freuen ;-); das gleiche gilt auch für den Tomcat, im JBoss dagegen funktioniert dies. Hintergrund dafür ist, das der VM bei dem obigen Beispiel kein MBean (Managed Bean) bekannt ist.

MBean schreiben und registrieren: auch doof...

Wenn man nun die Log Implementierung austauscht auf bspw. Jdk14Logger, der Log-Implementierung von Java.

Austauchen geht ganz einfach: Änderung der commons-logging.properties

org.apache.commons.logging.Log = org.apache.commons.logging.impl.Jdk14Logger

Mit dieser Implementierung kann nun bspw. mit der jconsole direkt das Loglevel zur Laufzeit geändert werden. Doch Achtung: die Loglevel bei java.util.logging lauten anders als bei log4j (siehe http://java.sun.com/j2se/1.4.2/docs/api/java/util/logging/Level.html).

Nachdem ich log4j gegenüber java.util.logging bevorzuge ist dies natürlich auch keine wirkliche Alternative. Aber: funzt!

Keine Kommentare:

Kommentar veröffentlichen