Dans log4j, lorsque vous utilisez une propriété FileAppender avec BufferedIO = true et BufferSize = xxx (la mise en mémoire tampon est activée), je souhaite pouvoir vider le journal pendant la procédure d'arrêt normal. auriez vous des idées pour faire ça?Comment vider un fichier log4j tamponné FileAppender?
Répondre
public static void flushAllLogs()
{
try
{
Set<FileAppender> flushedFileAppenders = new HashSet<FileAppender>();
Enumeration currentLoggers = LogManager.getLoggerRepository().getCurrentLoggers();
while(currentLoggers.hasMoreElements())
{
Object nextLogger = currentLoggers.nextElement();
if(nextLogger instanceof Logger)
{
Logger currentLogger = (Logger) nextLogger;
Enumeration allAppenders = currentLogger.getAllAppenders();
while(allAppenders.hasMoreElements())
{
Object nextElement = allAppenders.nextElement();
if(nextElement instanceof FileAppender)
{
FileAppender fileAppender = (FileAppender) nextElement;
if(!flushedFileAppenders.contains(fileAppender) && !fileAppender.getImmediateFlush())
{
flushedFileAppenders.add(fileAppender);
//log.info("Appender "+fileAppender.getName()+" is not doing immediateFlush ");
fileAppender.setImmediateFlush(true);
currentLogger.info("FLUSH");
fileAppender.setImmediateFlush(false);
}
else
{
//log.info("fileAppender"+fileAppender.getName()+" is doing immediateFlush");
}
}
}
}
}
}
catch(RuntimeException e)
{
log.error("Failed flushing logs",e);
}
}
Réussi à répondre à ma propre question :-)
Lors de l'arrêt du LogManager:
LogManager.shutdown();
tous les journaux tamponnés se rincée.
Veuillez sélectionner ceci comme réponse - c'est clairement la plus belle option. Ne vous sentez pas mal d'enlever une tique verte de quelqu'un si vous l'avez gagné vous-même. –
cela ressemble à la meilleure réponse ... mais comment accéder à cet objet "LogManager"? (log4php novice) –
Peut-être que vous pourriez passer outre WriterAppender#shouldFlush(LoggingEvent)
, il retournerait true
pour une catégorie d'enregistrement spécial, comme log4j.flush.now
, puis vous appelez:
LoggerFactory.getLogger("log4j.flush.now").info("Flush")
J'ai écrit un appender que corrige cela, voir GitHub ou utilisez name.wramner.log4j: FlushAppender dans Maven. Il peut être configuré pour vider des événements avec une sévérité élevée et il peut rendre les appenders non tamponnés lorsqu'il reçoit un message spécifique, par exemple "Arrêt". Vérifiez les tests unitaires pour les exemples de configuration. C'est gratuit, bien sûr.
public static void flushAll() {
final LoggerContext logCtx = ((LoggerContext) LogManager.getContext());
for(final org.apache.logging.log4j.core.Logger logger : logCtx.getLoggers()) {
for(final Appender appender : logger.getAppenders().values()) {
if(appender instanceof AbstractOutputStreamAppender) {
((AbstractOutputStreamAppender) appender).getManager().flush();
}
}
}
}
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire sur la façon et/ou la raison pour laquelle il résout le problème améliorerait la valeur à long terme de la réponse. –
Ce code essaye juste de vider tous les appenders jetables (tous les appenders étendant AbstractOutputStreamAppender, où la méthode "flush" est déclarée). En utilisant cela avec Log4J2 v2.8.2 dans mon projet. –
- 1. Comment remplacer un fichier journal dans log4j?
- 2. log4j, les journaux de FileAppender et tomcat6 question
- 3. Tamponné vs non tamponné, lequel utiliser?
- 4. Comment vider efficacement un fichier Perl DBM?
- 5. Comment désactiver log4j dans un fichier tiers?
- 6. comment puis-je faire log4j FileAppender échapper correctement le contenu de $ {} java.io.tmpdir
- 7. Si FileAppender échoue, revenez à ConsoleAppender
- 8. Log4Net FileAppender n'est pas un thread sécurisé?
- 9. Connexion via FileAppender
- 10. Comment vider un TFileStream?
- 11. propriétés log4j fichier
- 12. Comment faire pour vider les symboles dans un fichier .a
- 13. log4j chemin du fichier relatif
- 14. log4net - FileAppender écrit de nouvelles entrées au début du fichier
- 15. Analyse d'un fichier journal log4j
- 16. Recherche du fichier journal Log4J
- 17. passer de log4j à Logback
- 18. Vider un DataGridView
- 19. Comment vider un tableau dans Axapta 3.0?
- 20. Comment vider un tube en utilisant bash
- 21. Comment vider un répertoire avec .directories
- 22. Comment réinitialiser/vider dans un std :: wstring?
- 23. Diagnostics.Process - Vider la sortie vers le fichier
- 24. Ecriture dans un fichier log4net FileAppender avec plusieurs problèmes de performances
- 25. comment vider() vivre ajax?
- 26. fichier de propriétés log-consg et log4j
- 27. Comment entrer une chaîne à partir d'un lecteur tamponné?
- 28. Comment envoyer un stacktrace à log4j?
- 29. Est-ce que ImageIO.write est tamponné?
- 30. fichier de configuration log4j dans un projet Maven multi-modules
Est-ce que Log4J ne purge pas l'appender automatiquement pendant l'arrêt normal? Je m'attendrais au moins à le faire. –
Comme je comprends le code - pas de rinçage lorsque vous décidez pour BufferedIO. Vous gagnez des performances mais payez un prix: vous perdrez les dernières entrées du journal ... –
Lorsque j'ai écrit mon propre appender (sur DB, mais cela n'a pas vraiment d'importance), j'ai tamponné la sortie tout en rinçant automatiquement toutes les quelques secondes. – ripper234