2017-09-11 4 views
1

J'ai besoin de vider immédiatement le journal sur le disque puis de le mettre en mode tampon normal.Comment faire pour vider un fichier log4j tamponné FileAppender sans arrêt?

L'exigence est que je dois générer le journal horaire. Par exemple, user_info.2017-09-08-18.log. Chaque heure en générera une. J'utilise donc un ScheduledExecutorService pour écrire une chaîne simple à consigner au début de chaque heure. Mais j'ai trouvé que si le tampon n'est pas plein, le journal est toujours dans le tampon. Donc, je veux immédiatement écrire un journal au début de chaque heure, assurez-vous que chaque heure a un journal. Donc, Logger.shutdown() n'est pas une méthode appropriée dans cette situation.

Ceci est ma propriétés définition:

log4j.appender.user_push_info=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.user_info.File=/data/log/user_info 
log4j.appender.user_info.DatePattern='.'yyyy-MM-dd-HH'.log' 
log4j.appender.user_info.layout=org.apache.log4j.PatternLayout 
log4j.appender.user_info.layout.ConversionPattern=%m%n 
log4j.appender.user_info.BufferedIO=true 
log4j.appender.user_info.BufferSize=8192 
+0

Bien que la dupe est sur le point "à l'arrêt", il * sont * des réponses indépendantes de l'arrêt ou non. – Fildor

Répondre

0

Pour Log4j 1.2, vous pouvez set immediate flush ensuite revenir à un comportement normal avec:

Logger logger = Logger.getRootLogger(); 
Appender appender = logger.getAppender("name"); 
if (appender instanceof WriterAppender) { 
    ((WriterAppender) appender).setImmediateFlush(true); 
    logger.info("Flushing log"); 
    ((WriterAppender) appender).setImmediateFlush(false); 
} 
+0

Comment obtenir fileAppender? Je peux obtenir Appender en utilisant Logger.getRootLogger(). getAppender ("name"), mais il n'y a pas de méthode appelée setImmediateFlush. –

+0

Quelle version de log4j utilisez-vous? –

+0

groupe de compilation: 'log4j', nom: 'log4j', version: '1.2.17'. Il semble que je devrais obtenir FileAppender au lieu de Appender –