Log4j2 – Globalen Logger konfigurieren



Apache Log4j Logo


Log4j ist ein mächtiges Logging-Framework für Java-Anwendungen. Die offizielle Dokumentation beschreibt die Logger-Implementation in jeder Klasse durch eine eigene private Logger-Instanz. Diese Vorgehensweise ist gut, wenn man für jede Klasse einen separaten Logger verwenden will. Wie implementiert und konfiguriert man aber einen globalen Logger, dessen Instanz in jeder Klasse ohne Neuimplementierung einsetzbar wird? Hier ein Lösungbeispiel.

Globalen Logger definieren

Zuerst wird eine globale Klasse mit der öffentlichen, statischen Logger-Instanz benötigt.

package com.test.core
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Global {
	public static final Logger logger = LogManager.getLogger("log4j2.all");
}

Wichtig ist, die globale statische logger-Konstante ist öffentlich (public) um auf sie von Außen zugreifen zu können. Der LogManager.getLogger-Funktion wird der Loggername aus der Konfiguration übergeben.

XML-Configuration

Die Beispielkonfiguration schreibt alle Log-Nachrichten ab dem Level TRACE in eine Plain Text-Datei (“test.log”), dann in eine HTML-Datei (“test.html”) und eine für den LogSaw Viewer formatierte XML-Datei (“test.xml”). Log-Nachrichten mit dem Level ERROR und FATAL werden zusätzlich in der Konsole ausgegeben. Nach dem Erreichen einer vorgegebenen Dateigröße werden bis zu 5 Log-, HTML- und XML-Dateien archiviert. Das Configuration-Attribut packages gibt die verwendeten, externen Appender und Layout Plugin-Klassen an.

log4j2.xml – Beispiel

<?xml version="1.0" encoding="UTF-8"?>
<Configuration 
    packages="net.wallstep.logging.log4j.plugin.appender,net.wallstep.logging.log4j.plugin.layout" 
    name="TestLog4j2Config"
    status="warn"
    dest="logs/log4j2-internal.log"
    verbose="true">
    <Properties>
	<Property name="basePath">logs</Property>
	<Property name="fileName">test</Property>
    	<Property name="logFilename">${basePath}/${fileName}.log</Property>
    	<Property name="htmlFilename">${basePath}/${fileName}.html</Property>
    	<Property name="log4jXmlFilename">${basePath}/${fileName}.xml</Property>
    </Properties>
    <Appenders>
        <Console name="Console">
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"></PatternLayout>
    	</Console>
    	<RollingFile name="PlainTextFile" fileName="${logFilename}" filePattern="${basePath}/${fileName}-%i.log.gz" immediateFlush="false">
            <ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout>
                <pattern>%d %p [%l] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="502 KB" />
            </Policies>
            <DefaultRolloverStrategy fileIndex="min" min="1" max="3" />
        </RollingFile>
	<InsertLogRollingFile name="HtmlRollingFile" fileName="${htmlFilename}" filePattern="${basePath}/${fileName}-%i.html.gz" immediateFlush="false">
            <HtmlBetterLayout charset="UTF-8" datePattern="ISO8601" timezone="GMT+2" locationInfo="true" title="Test Log" />
            <ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="1735 KB" />
            </Policies>
            <DefaultRolloverStrategy fileIndex="min" min="1" max="3" />
	</InsertLogRollingFile>
	<RollingFile  name="XmlRollingFile" fileName="${log4jXmlFilename}" filePattern="${basePath}/${fileName}-%i.xml.gz" immediateFlush="false">
            <LogSawXmlLayout locationInfo="true" />
            <ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="1550 KB" />
            </Policies>
            <DefaultRolloverStrategy fileIndex="min" min="1" max="3" />
	</RollingFile>
    </Appenders>
    <Loggers>
        <Root level="ERROR">
            <AppenderRef ref="Console"/>
	</Root>
	<logger name="log4j2" level="TRACE" additivity="true">
            <AppenderRef ref="HtmlRollingFile"/>
            <AppenderRef ref="XmlRollingFile"/>
        </logger>
	<logger name="log4j2.all" level="TRACE" additivity="true">
            <AppenderRef ref="PlainTextFile"/>
        </logger>
    </Loggers>
</Configuration>

Hinweis: Damit die Konfigurationsdatei von dem LogManager automatisch gefunden wird, muss sie in dem src-Verzeichnis liegen. Besser im src/main/resources.

Anzeige

Logger einsetzen

Der globale Logger kann jetzt in jeder Klasse aufgerufen werden, ohne eine neue Instanz erstellen zu müssen.

package com.test.gui;

import com.test.core.Global;

public class AboutDialog extends JDialog {

	public AboutDialog(JFrame parent) {
		super(parent, "About", true);
		Global.logger.trace("Creating AboutDialog...");
		...
	}
}

Logs Darstellung

Log4j2-PlainText-Log
test.log
Log4j2-Xml-Log
test.xml
Log4j2-Html-Log
test.html
Log4j2-Console-Log
Ausgabe in der Console


Anzeige

War diese Seite für dich informativ? Hat sie dir gefallen und geholfen?

Dann unterstütze die Weiterentwicklung mit einer kleinen Spende!

Die Spenden werden für die Lizenzen sowie neue Hard- und Software verwendet, die für weitere Projekte auf dieser Webseite eingesetzt werden.





Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.