Usiamo log4j 1.2.x per accedere al nostro prodotto e stiamo cercando di migrare a log4j 2.x nel prossimo futuro. Una delle funzionalità che abbiamo implementato è quella di registrare le informazioni di sistema e altri parametri importanti su ogni nuovo file di registro di rollover generato. Il modo in cui abbiamo implementato in log4j 1.2.x è che abbiamo esteso RollingFileAppender
classe di log4j e hanno ignorato il metodo rollOver()
, qui di seguito è il frammento di parte dell'implementazioneCome personalizzare log4j2 RollingFileAppender?
@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.
//
}
Ora, come vogliamo migrare verso log4j2 siamo guardando una nuova soluzione per ottenere la stessa funzionalità. Ma come vedo il codice sorgente per log4j2 è molto diverso dal vecchio codice sorgente. La classe RollingFileAppender
non contiene il metodo rollover()
poiché è stato spostato su RollingManagerhelper
ed è stato impostato su private
come bene.
Sviluppare un nuovo pacchetto completo ed estendere/implementare alcune classi astratte/helper da log4j2 è una delle possibili soluzioni per noi ma richiederebbe molto codice/copia poiché non modifichiamo ciò che RollingFileAppender
preferisce, ma abbiamo solo bisogno piccola estensione ad esso. C'è una soluzione semplice ad esso?
UPDATE
ho creato una ricerca personalizzata secondo il suggerimento nelle risposte e al di sotto è come ho creato;
@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";
}}
Ma questo non ha funzionato come menzionato; questo stampa sempre this was first call
nell'intestazione. Ho anche provato a mettere il breakoint nella prima condizione di if
e quello che ho notato è che viene chiamato solo una volta. Quindi quello che temo è che la classe customLookup venga inizializzata solo all'avvio quando log4j2 sta inizializzando le sue proprietà da xml config. Non so in quale altro modo avrei potuto implementare questa classe di ricerca personalizzata.
UPDATE 2
Dopo la suddetta implementazione ho provato in modo diverso bit che è come sotto;
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";
}
}
Ma la stessa cosa è la stessa cosa. log4j2 crea le intestazioni durante l'inizializzazione dal suo file di configurazione xml e quindi usa le intestazioni dalla memoria. Il valore return
del metodo lookup()
sottoposto a override non può essere modificato dinamicamente in quanto viene richiamato solo durante l'inizializzazione. Qualsiasi altro aiuto sarebbe molto apprezzato.
Se si desidera utilizzare la sostituzione della variabile di runtime, utilizzare double $$ quando si specifica la chiave variabile nel file delle proprietà log4j2. – TrueCurry