Question

Je souhaite que le journal soit survolé tant que l'application est en cours d'exécution, mais je souhaite qu'il soit relancé au redémarrage de l'application.

Mise à jour: Basé sur les commentaires de erickson , mes 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 laisse les fichiers roulés seuls.

Était-ce utile?

La solution

Si vous définissez le paramètre append sur false , le fichier journal de base sera "quoté de départ". lorsque l'application redémarre. Voulez-vous dire que vous voulez tout " roulé " les fichiers journaux à supprimer aussi?

Autres conseils

J'ai écrit du code personnalisé pour trouver mon RollingFileAppender (auquel il est inutilement difficile d'accéder dans log4j!) et que je force 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 la rotation de mes journaux (si elle n'est pas vide). Je commence donc toujours dans un nouveau journal, mais je ne supprime jamais aucun journal, sauf 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 des appendices sont attachés. Si ce n'est jamais le cas, alors il abandonne. Si tel est le cas, il passe en boucle sur tous les appendices attachés à ce consignateur. Pour chacun d'entre eux qui est un RollingFileAppender, il force le journal à rouler.

Quelque chose comme cela devrait être beaucoup plus facile à faire dans log4j, mais je n'ai pas trouvé de moyen 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();
      }
    }
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top