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 setzeif
bedingung 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.