Logging mit log4j2 in verschiedene Dateien?

Diskutiere Logging mit log4j2 in verschiedene Dateien? im Allgemeine Java-Themen Bereich.
J

JustNobody

Ok, ich habe jetzt aber auch ein bisschen gebastelt. Irgendwie wollte er bei mir keinen neuen Logger / Appender einfügen. Aber ich habe problemlos einen existierenden Appender austauschen können.

Wieso ersteres nicht lief kann ich nicht sagen. Aber mein aktueller Zwischenstand ist dies:

Meine log4j2.xml definiert eine LogDatei. Das ist dann erst einmal mein Appender, den ich dann weiter verwenden möchte. "de.kneitzel" ist mein Package, aus dem ich logge ...
Code:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="STDOUT">
            <PatternLayout pattern="%C{1.} %level %m%n"/>
        </Console>
        <File name="LogDatei" fileName="./test.log">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Logger name="de.kneitzel" level="DEBUG">
            <AppenderRef ref="LogDatei"/>
        </Logger>
        <Root level="INFO">
            <AppenderRef ref="STDOUT" />
        </Root>
    </Loggers>
</Configuration>
Dann meine Klasse / Testprogramm:
Java:
package de.kneitzel.test;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.appender.FileAppender;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;

import java.io.Serializable;

public class Log4jAppenderHandler {

    private static Logger log = LogManager.getLogger(Log4jAppenderHandler.class.getName());

    private String appenderName;
    private String packageName;

    private LoggerContext context;
    private Configuration configuration;
    private Layout<? extends Serializable> layout;

    public Log4jAppenderHandler(final String appenderName, final String packageName) {
        this.appenderName = appenderName;
        this.packageName = packageName;

        context = (LoggerContext) LogManager.getContext(false);
        configuration = context.getConfiguration();
        layout = configuration.getAppender(appenderName).getLayout();
    }


    void updateLogger(final String fileName){

        //delete old appender/logger
        configuration.getAppender(appenderName).stop();
        configuration.removeLogger(packageName);

        //create new appender/logger
        LoggerConfig loggerConfig = new LoggerConfig(packageName, Level.INFO, false);
        FileAppender appender = FileAppender.newBuilder()
                .withFileName(fileName)
                .withAppend(false)
                .withLocking(false)
                .setName(appenderName)
                .withImmediateFlush(true)
                .setIgnoreExceptions(true)
                .withBufferedIo(true)
                .withBufferSize(8192)
                .setLayout(layout)
                .setFilter(null)
                .withAdvertise(false)
                .setConfiguration(configuration)
                .build();
        appender.start();
        loggerConfig.addAppender(appender, Level.INFO, null);
        configuration.addLogger(packageName, loggerConfig);

        context.updateLoggers();
    }

    public static void main(String[] args) {
        // First test message...
        log.warn("Start logging test!");

        // appenderName und packageName kommen aus log4j.xml!
        Log4jAppenderHandler log4jHandler = new Log4jAppenderHandler("LogDatei", "de.kneitzel");

        log4jHandler.updateLogger("./test1.log");
        log.warn ("After updating to test1.log!");

        log4jHandler.updateLogger("./test2.log");
        log.warn ("After updating to test2.log!");
    }

}

Bei meinem Testprogramm wird dann das Logging immer schön weiter umgeleitet.
Erst das ./test.log aus dem Config-File. Da landet dann das erste logging drin.
Dann kommt der switch zu test1.log -> und das nächste log kommt da rein.
Dann switch zu test2.log und das letzte log kommt da in die Datei.

Damit hätte man etwas Code, der zur Laufzeit ein Logfile ändern kann.
 
M

MiMa

Danke, das du dich damit beschäftigt hast.
Ich kenne mich nicht gut genug damit aus um es so zu lösen. :)
Habe den ganzen Tag damit verbracht und bin da nicht weiter gekommen. Dann habe ich mit ca 10 Zeilen einen eigenen Logger geschrieben, der mir 3 verschiedene Dateien schreibt und konnte meine log4j Anweisungen sehr einfach ändern.
Auf jeden Fall schaue ich mit Deinen Code an und versuche das mal nach zu verfolgen um eine Wissenslücke zu schließen.
Eine Logdatei loggt die Anwendung, eine weitere Loggt nur die erzeugten Metadaten und die dritte Loggt alle Fehler.
Da ich mich noch nicht mit JUnit beschäftigen konnte kontrolliere ich halt die Logs.
 
M

MiMa

@JustNobody
nochmal vielen Dank.
Ich habe deinen Lösungsweg verstanden und werde diesen in meiner Version mit Java-FX und GUI implemetieren.
Der File-Appender hat ja echt viele Parameter ;)
Mi
 
Thema: 

Logging mit log4j2 in verschiedene Dateien?

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben