ho praticamente appena risposto la stessa domanda e io duro io condividere la mia risposta qui. Vi incoraggio a leggere il complete answer available here. Cercherò di fornire un riassunto qui e adattare la mia risposta al contesto attuale.
Nella prima versione, Log4j forniva un'API per chiamare manualmente la procedura di arresto. Per ragioni di cui non abbiamo conoscenza, it was removed from the second version. Ora, il modo corretto di farlo (secondo la documentazione inesistente), è quello di fornire la propria implementazione dell'interfaccia ShutdownCallbackRegistry
, che è responsabile della procedura di spegnimento.
Soluzione proposta
Quello che ho fatto per risolvere il problema è che ho implementato la mia versione dell'interfaccia ShutdownCallbackRegistry
. Principalmente fa le stesse cose che fa l'implementazione di default, ma invece di registrarsi come un hook di shutdown per la JVM, aspetta che venga invocato manualmente.
È possibile trovare la soluzione completa e le istruzioni su GitHub/DjDCH/Log4j-StaticShutdown e utilizzarlo nei propri progetti. In sostanza, alla fine, devi solo fare qualcosa di simile nella vostra applicazione:
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
try {
// Do your usual shutdown stuff here that need logging
} finally {
// Shutdown Log4j 2 manually
StaticShutdownCallbackRegistry.invoke();
}
}
}));
Non posso dire senza alcun dubbio che questa è la soluzione perfetta e che la mia esecuzione è perfetta, ma ho provato farlo nel modo giusto Sarò lieto di ricevere feedback da voi, sia se trovate questa soluzione appropriata o meno.
La registrazione o, a seconda di altri servizi in ganci di arresto, è stata una pratica scorretta per tutto il tempo, e ora sta recuperando il ritardo. –
@MarkoTopolnik Se è una cattiva pratica come dici tu, cosa suggerisci di fare se l'output di un thread di hookdown ha bisogno di registrazione/registrazione? – vegemite4me
Dato che nel gancio di arresto non è possibile contare su alcuna parte dello stato inizializzato per esistere ancora, l'unica cosa che vedo come semi-affidabile è un pezzo di codice completamente autonomo che crea un file e scrive su di esso. Simile al modo in cui viene creato un core dump. –