web-dev-qa-db-fra.com

Comment configurer log4j pour ne conserver que les fichiers journaux des sept derniers jours?

J'ai le problème de journalisation suivant avec plusieurs applications Java utilisant log4j pour la journalisation:

Je veux que les fichiers journaux fassent l'objet d'une rotation quotidienne, comme

log.2010-09-10
log.2010-09-09
log.2010-09-08
log.2010-09-07
log.2010-09-06
log.2010-09-05
log.2010-09-04

Mais pour des raisons de sécurité des données, nous ne sommes pas autorisés à conserver les fichiers journaux plus de sept jours dans mon entreprise. Ainsi, la génération du prochain fichier journal log.2010-09-11 devrait déclencher la suppression de log.2010-09-04. Est-il possible de configurer un tel comportement avec log4j? Si non, connaissez-vous une autre solution élégante à ce type de problème de journalisation?

51
asmaier

Vous pouvez effectuer votre ménage dans un script séparé qui peut être créé pour être exécuté quotidiennement. Quelque chose comme ça:

find /path/to/logs -type f -mtime +7 -exec rm -f {} \;
25
dogbane

Je suppose que vous utilisez RollingFileAppender? Dans ce cas, il possède une propriété appelée MaxBackupIndex que vous pouvez définir pour limiter le nombre de fichiers. Par exemple:

log4j.appender.R=org.Apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=7
log4j.appender.R.layout=org.Apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
51
dty

Selon le post suivant, vous ne pouvez pas faire cela avec log4j: Utilisez MaxBackupIndex dans DailyRollingFileAppender -log4j

Autant que je sache, cette fonctionnalité devait faire partie de log4j 2.0 mais cet effort a été détourné. Selon le site Web de logback, logback est le successeur prévu de log4j, vous pouvez donc envisager de l'utiliser.

Il existe une API appelée SLF4J qui fournit une API commune pour la journalisation. Il charge l'implémentation de journalisation réelle au moment de l'exécution. Ainsi, selon la configuration que vous avez fournie, il peut utiliser Java.util.log ou log4j ou logback ou toute autre bibliothèque capable de fournir des fonctions de journalisation. L'utilisation de log4j directement vers SLF4J nécessitera un peu de travail en amont, mais ils fournissent des outils pour automatiser ce processus. Une fois que vous avez converti votre code pour utiliser SLF4J, vous devez simplement changer le fichier de configuration pour changer de système de journalisation.

13
PhilDin

log2j a maintenant le support pour supprimer les anciens journaux. Jetez un coup d'oeil à la balise DefaultRolloverStrategy et à un extrait ci-dessous. Il crée jusqu'à 10 archives le même jour, analyse le répertoire $ {baseDir} que vous définissez sous la balise Properties à une profondeur maximale de 2 avec le nom du fichier journal correspondant à "app - *. Log.gz" et supprime les journaux de plus de 7 jours mais conservez les 5 journaux les plus récents si vos 5 journaux les plus récents datent de plus de 7 jours.

  <DefaultRolloverStrategy max="10">
    <Delete basePath="${baseDir}" maxDepth="2">
      <IfFileName glob="*/app-*.log.gz">
        <IfLastModified age="7d">
          <IfAny>
            <IfAccumulatedFileCount exceeds="5" />
          </IfAny>
        </IfLastModified>
      </IfFileName>
    </Delete>
  </DefaultRolloverStrategy>
5
skim

Il existe également un DailyRollingFileAppender; http://logging.Apache.org/log4j/1.2/apidocs/org/Apache/log4j/DailyRollingFileAppender.html

Edit: Après avoir lu cette déclaration inquiétante;

Il a été observé que DailyRollingFileAppender présentait une synchronisation problèmes et perte de données. Le complément log4j inclut des alternatives qui devrait être considéré pour de nouveaux déploiements et qui sont discutés dans la documentation de org.Apache.log4j.rolling.RollingFileAppender.

à partir de l'URL ci-dessus (que je n'avais jamais réalisée auparavant), cela ressemble à un meilleur pari; http://logging.Apache.org/log4j/companions/extras/apidocs/index.html

4
Qwerky

Je suis tombé sur cet appender ici qui fait ce que vous voulez, il peut être configuré pour conserver un nombre spécifique de fichiers qui ont été transférés par date.

Télécharger: http://www.simonsite.org.uk/download.htm

Exemple (groovy):

new TimeAndSizeRollingAppender(name: 'timeAndSizeRollingAppender',
   file: 'logs/app.log', datePattern: '.yyyy-MM-dd',
   maxRollFileCount: 7, compressionAlgorithm: 'GZ',
   compressionMinQueueSize: 2,
   layout: pattern(conversionPattern: "%d [%t] %-5p %c{2} %x - %m%n"))
3
Green Man

Il existe une autre option DailyRollingFileAppender . mais il manque la fonction de suppression automatique (garder le journal de 7 jours) que vous cherchez

échantillon

log4j.appender.DRF=org.Apache.log4j.DailyRollingFileAppender
log4j.appender.DRF.File=example.log
log4j.appender.DRF.DatePattern='.'yyyy-MM-dd

Je tombe sur quelque chose qui s'appelle org.Apache.log4j.CompositeRollingAppender , qui combine les deux fonctionnalités de RollingFileAppender (maxSizeRollBackups, nombre de fichiers de sauvegarde) et DailyRollingFileAppender (rouleau par jour ). 

Mais je n’ai pas essayé cela, ne semble pas être la fonction standard 1.2 de log4j.

3
user444904

Si vous utilisez Linux, vous pouvez configurer un travail cron à l'aide de tmpwatch.

La plupart des systèmes Linux ont un travail cron tmpwatch qui nettoie le répertoire/tmp. Vous pouvez en ajouter un autre qui surveille votre répertoire de journalisation et supprime les fichiers de plus de 7 jours.

Si vous utilisez un système différent, il existe probablement des utilitaires équivalents.

1
emory

Utilisez le paramètre log4j.appender.FILE.RollingPolicy.FileNamePattern, par exemple. log4j.appender.FILE.RollingPolicy.FileNamePattern=F:/logs/filename.log.%d{dd}.gz pour conserver les journaux un mois avant le basculement.

Je n’ai pas attendu un mois pour vérifier, mais j’ai essayé avec mm (c’est-à-dire les minutes) et ai confirmé que tout était écrasé. Je suppose donc que cela fonctionnera pour tous les modèles.

1
Ketan K Shah

Malgré le démarrage d'un travail chrone, nous pouvons utiliser le fichier log4j2.properties dans le dossier config de logstash. Regardez le lien ci-dessous, cela sera utile.

https://github.com/elastic/logstash/issues/7482

0
Vaibhav Jain