2017-08-17 10 views
0

J'utilise log4j2 (version 2.5) dans Java 8.Comment faire un fichier journal avec une seule ligne qui est écrasée à chaque fois?

J'ai besoin d'un fichier journal avec une seule ligne. Donc pour chaque écriture, la ligne précédente si elle existe doit être écrasée par la nouvelle ligne.

log4j.properties:

name=testLoggerOneLine 
appenders=console, logFile 

appender.console.type=Console 
appender.console.name=STDOUT 
appender.console.layout.type=PatternLayout 
appender.console.layout.pattern=[%-5level] %d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} 
[%t] %c{1} - %msg%n 

appender.logFile.type=File 
appender.logFile.name=LOGFILE 
appender.logFile.fileName=C:/Users/mggl/workspace/Test/logs/Test.log 
#appender.logFile.immediateFlush=true 
#appender.logFile.append=false 
#appender.logFile.createOnDemand=false 
appender.logFile.layout.type=PatternLayout 
appender.logFile.layout.pattern=%msg%n 

loggers=logFile 

logger.logFile.name=Test 
logger.logFile.level=debug 
logger.logFile.appenderRefs=logFile 
logger.logFile.appenderRef.logFile.ref=LOGFILE 
logger.logFile.additivity=false 

rootLogger.level=debug 
rootLogger.appenderRefs=stdout 
rootLogger.appenderRef.stdout.ref=STDOUT 

code fictif:

package Test.loggingTest; 

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 

public class OneLineLog 
{ 
    public static void main(String[] args) 
    { 
     Logger logger = LogManager.getLogger("testLoggerOneLine"); 

     logger.info("first writing"); 

     logger.info("second writing"); 

     logger.info("third writing"); 
    } 
} 

En test.log il doit être écrit que la dernière information de l'exploitation forestière.

L'option append avec la valeur false fait le travail pour un tas d'informations de journalisation à chaque démarrage de l'application. Je veux faire la même chose pour chaque ligne sans redémarrer l'application.

Toute idée ou suggestion est appréciée. Merci d'avance.

+0

Par curiosité: pourquoi? –

+0

C'est une exigence. Si c'était moi, je ne ferais pas un journal de cette façon. – mggl

+0

Pourquoi quelqu'un aurait-il besoin de cela? Btw, je ne connais pas log4j, mais une rotation d'une ligne pourrait être la solution. –

Répondre

0

J'ai résolu le problème en utilisant les options append et immediateFlush (définies respectivement sur false et true) dans log4j.properties et en forçant le rollover sur l'appender associé au logger. J'ai utilisé l'extrait écrit par rgoers dans cette discussion: How to rotate a log4j log manually

log4j.properties:

name=Test 

appenders=console, logFile 

appender.console.type=Console 
appender.console.name=STDOUT 
appender.console.layout.type=PatternLayout 
appender.console.layout.pattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} - %msg%n 

appender.logFile.type=RollingFile 
appender.logFile.name=LOGFILE 
appender.logFile.fileName=.../logs/Test.log 
appender.logFile.filePattern=.../logs/%d{yyyyMMdd'T'HH:mm:ss.SSSZ}-Test.log.gz 
appender.logFile.layout.type=PatternLayout 
appender.logFile.layout.pattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ}: %m%n 
appender.logFile.policies.type=Policies 
appender.logFile.policies.time.type=TimeBasedTriggeringPolicy 
appender.logFile.policies.time.interval=1 
appender.logFile.policies.time.modulate=true 
appender.logFile.policies.size.type=SizeBasedTriggeringPolicy 
appender.logFile.policies.size.size=500MB 
appender.logFile.strategy.type=DefaultRolloverStrategy 
appender.logFile.strategy.max=10 
appender.logFile.append=false 
appender.logFile.immediateFlush=true 

loggers=logFile 

logger.logFile.name=Test 
logger.logFile.level=debug 
logger.logFile.appenderRefs=logFile 
logger.logFile.appenderRef.logFile.ref=LOGFILE 
logger.logFile.additivity=false 

rootLogger.level=debug 
rootLogger.appenderRefs=stdout 
rootLogger.appenderRef.stdout.ref=STDOUT 

code:

package Test.loggingTest; 

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.apache.logging.log4j.core.Appender; 
import org.apache.logging.log4j.core.LoggerContext; 
import org.apache.logging.log4j.core.appender.RollingFileAppender; 
import org.apache.logging.log4j.core.config.AbstractConfiguration; 

public class OneLineLog { 
    public static void main(String[] args) { 

     Logger logger = LogManager.getLogger("Test"); 

     try { 

      logger.info("first writing"); 

      LoggerContext loggerContext = (LoggerContext) LogManager.getContext(); 
      AbstractConfiguration logConfig = (AbstractConfiguration) loggerContext.getConfiguration(); 
      Appender logAppender = logConfig.getAppender("LOGFILE"); 
      if (logAppender instanceof RollingFileAppender) { 
       RollingFileAppender rollingFileAppender = (RollingFileAppender) logAppender; 
       rollingFileAppender.getManager().rollover(); 
      } 

      Thread.sleep(5000); 

      logger.info("second writing"); 
     } catch (Exception e) { 
      System.out.println("Exception: " + e); 
     } 

    } 
}