2008-11-06 5 views
29

Je souhaite que le journal se répète tant que l'application est en cours d'exécution, mais je souhaite que le journal redémarre lorsque l'application est redémarrée.Comment faire pour que log4j efface un journal au démarrage?

Mise à jour: Basé sur erickson's commentaires, mon appender ressemble à ceci:

<appender name="myRFA" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="my-server.log"/> 
     <param name="Append" value="false" /> 
     <param name="MaxFileSize" value="10MB"/> 
     <param name="MaxBackupIndex" value="10"/> 
     <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" 
      value="%d{ISO8601} %p - %t - %c - %m%n"/> 
     </layout> 
    </appender> 

J'ai simplement ajouté la ligne suivante:

<param name="Append" value="false" /> 

Il tronque maintenant le fichier journal de base au démarrage , mais il laisse les fichiers roulés tout seul.

+7

Pour ceux qui n'utilisent pas le format XML du fichier de propriétés: log4j.appender.file.Append = false –

Répondre

38

Si vous définissez le paramètre append sur false, le fichier journal de base sera "redémarré" au redémarrage de l'application. Voulez-vous dire que vous voulez supprimer tous les fichiers journaux "rolled"?

+0

Non, les fichiers « roulées » peut rester. Je veux juste que le fichier journal de base soit effacé de sorte que lorsque je débogue, je n'ai pas à passer par les anciennes entrées pour la sortie la plus récente. – braveterry

+2

Notez que append = false * écrase * le fichier journal actuel au lieu de le lancer (sauvegarde). – Pino

+0

Malheureusement, le rollover se produit uniquement au redémarrage de la machine virtuelle Java, donc si vous utilisez une construction continue, cela ne fonctionnera pas. –

5

J'ai écrit du code personnalisé pour trouver mon RollingFileAppender (ce qui est inutilement difficile à obtenir dans log4j!) Que je fais ensuite basculer. J'ai adapté mon code ci-dessous pour un usage unique. J'utilise un code similaire à celui-ci au démarrage de l'application pour forcer mes logs à rouler (si non-vide) donc je commence toujours dans un nouveau journal mais ne supprime jamais aucun journal mais le plus ancien.

Ce code prend un enregistreur donné et boucle la hiérarchie de l'enregistreur jusqu'à ce qu'il trouve un enregistreur auquel sont rattachés des appendices. Si cela ne le fait jamais, alors il abandonne. Si c'est le cas, il boucle sur tous les Appenders attachés à ce Logger et pour chaque RollingFileAppender, il force le log à rouler.

Quelque chose comme devrait être beaucoup plus facile à faire dans log4j, mais je n'ai pas trouvé une façon plus simple de le faire.

public void rollLogFile(Logger logger) { 
    while (logger != null && !logger.getAllAppenders().hasMoreElements()) { 
    logger = (Logger)logger.getParent(); 
    } 

    if (logger == null) { 
    return; 
    } 

    for (Enumeration e2 = logger.getAllAppenders(); e2.hasMoreElements();) { 
    final Appender appender = (Appender)e2.nextElement(); 
    if (appender instanceof RollingFileAppender) { 
     final RollingFileAppender rfa = (RollingFileAppender)appender; 
     final File logFile = new File(rfa.getFile()); 
     if (logFile.length() > 0) { 
     rfa.rollOver(); 
     } 
    } 
    } 
} 
Questions connexes