Wie kann ich log4j2 RollingFileAppender anpassen?

Wir verwenden log4j 1.2.x für die Anmeldung in unserem Produkt und möchten in naher Zukunft auf log4j 2.x migrieren. Eine der von uns implementierten Funktionen besteht darin, die Systeminformationen und andere Import- und Parameter in jeder neuen Rollover-Protokolldatei zu protokollieren, die generiert wird. Die Art und Weise, wie wir in log4j 1.2.x implementiert haben, ist, dass wir @ erweitert habeRollingFileAppender Klasse von log4j und haben die @ überschriebrollOver() -Methode, unten ist der Teilausschnitt der Implementierung

@Override
public void rollOver() {

    super.rollOver(); //We are not modifying it's default functionality but as soon as rollOver happens we apply our logic 

    // 
    // Logic to log required system properties and important parameters.
    //

}

Jetzt, da wir auf log4j2 migrieren möchten, suchen wir nach einer neuen Lösung, um die gleiche Funktionalität zu erreichen. Aber wie ich den Quellcode für log4j2 sehe, unterscheidet er sich sehr vom älteren Quellcode. DasRollingFileAppender class enthält keinrollover() -Methode, da sie nach @ verschoben wurRollingManagerhelper und es wurde auf @ gesetprivate auch

Die Entwicklung eines komplett neuen Pakets und die Erweiterung / Implementierung einiger Abstract- / Helfer-Klassen von log4j2 ist eine der möglichen Lösungen für uns, aber das würde viel Codierung / Kopieren erfordern, da wir nicht ändern, wasRollingFileAppender braucht man eher nur eine kleine erweiterung dazu. Gibt es eine einfache Lösung dafür?

AKTUALISIERE

Ich habe eine benutzerdefinierte Suche gemäß dem Vorschlag in den Antworten erstellt. Im Folgenden wird beschrieben, wie ich sie erstellt habe.

@Plugin(name = "property", category = StrLookup.CATEGORY)
public class CustomLookup extends AbstractLookup {

private static AtomicLong aLong = new AtomicLong(0);

@Override
public String lookup(LogEvent event, String key) {

    if (aLong.getAndIncrement() == 0) {
        return "this was first call";
    }
    if (key.equalsIgnoreCase("customKey")) {
        return getCustomHeader();
    } else {
        return "non existing key";
    }
}

private static String getCustomHeader() {

    // Implementation of custom header
    return "custom header string";

}}

Aber dies funktionierte nicht wie erwähnt; das druckt immerthis was first call in der Kopfzeile. Ich habe auch versucht, einen Breakoint auf das erste @ zu setzeifbedingung und mir ist aufgefallen, dass es nur einmal aufgerufen wird. Ich fürchte also, dass die customLookup-Klasse nur beim Start initialisiert wird, wenn log4j2 seine Eigenschaften über xml config initialisiert. Ich weiß nicht, wie ich diese benutzerdefinierte Lookup-Klasse sonst implementieren könnte.

UPDATE 2

Nach der obigen Implementierung habe ich es auf etwas andere Weise versucht, wie unten beschrieben;

private static AtomicLong aLong = new AtomicLong(0);

@Override
public String lookup(LogEvent event, String key) {
    return getCustomHeader(key);
}

private static String getCustomHeader(final String key) {

    if (aLong.getAndIncrement() == 0) {
        return "this was first call";
    }
    if (key.equalsIgnoreCase("customKey")) {
        // Implementation for customKey
        return "This is custom header";
    } else {
        return "non existing key";
    }
}

Aber das macht das selbe auch. log4j2 erstellt die Header bei der Initialisierung aus seiner XML-Konfigurationsdatei und verwendet dann die Header aus dem Speicher. Dasreturn Wert von überschriebenlookup()ie @ -Methode kann nicht dynamisch geändert werden, da sie nur während der Initialisierung aufgerufen wird. Jede weitere Hilfe wäre sehr dankbar.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage