web-dev-qa-db-fra.com

Stratégie de déclenchement basée sur le temps dans log4j2

J'essaie de créer de nouveaux fichiers journaux toutes les heures. J'utilise TimeBasedTriggerringPolicy de lo4j2 dans RollingFileAppender. Vous trouverez ci-dessous un exemple de code de configuration XML extrait du site officiel log4j2.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
   <Appenders>
      <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz">
         <PatternLayout>
            <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
         </PatternLayout>
         <Policies>
            **
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            **
            <SizeBasedTriggeringPolicy size="250 MB" />
         </Policies>
      </RollingFile>
   </Appenders>
   <Loggers>
      <Root level="error">
         <AppenderRef ref="RollingFile" />
      </Root>
   </Loggers>
</Configuration>

Dans l'attribut intervalle, j'ai défini 1, ce qui signifie 1 heure . Mais mon fichier ne continue pas à rouler toutes les heures.

S'il vous plaît aidez-moi à trouver une erreur.

Note: j'ai inclus la beta9 de log4j2 (qui est la dernière)

12
user1890780

1 indique ici 1 jour et non 1 heure. J'ai testé manuellement avec la configuration ci-dessous.

<RollingFile name="T" fileName="/data_test/log/abc.log"
        filePattern="/data_test/log/abc-%d{MM-dd-yyyy}-%i.log">
        <PatternLayout>
            <Pattern>%d{ISO8601} %-5p [%t] (%F:%L) - %m%n</Pattern>
        </PatternLayout>
        <Policies>              
            <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            <SizeBasedTriggeringPolicy size="100 KB" />
        </Policies>
    </RollingFile>

Pour les tests manuels, je change la date et l'heure du système ..__ D'abord, essayez d'augmenter de 1 heure. Les fichiers journaux seront générés, mais pas comme prévu . Modifiez ensuite la date du système, augmentez-le d'un jour et affichez les résultats.

Supposons que le dernier fichier journal (abc.log) du jour 29 octobre soit de 50 Ko. La taille de la configuration est de 100 Ko. Si nous changeons le jour (augmentons d'un jour) puis exécutons ..__, le dernier fichier sera renommé 29-Oct- (un numéro de séquence) .log (le fichier de 50 Ko sera copié) et le nouveau fichier sera créé avec abc.log

J'ai essayé cela avec une servlet simple avec la configuration ci-dessous dans web.xml

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>log4j2.xml</param-value>
</context-param>

conservez log4j2.xml dans le dossier src. log4j2.xml n'est pas chargé si nous le conservons dans classpath.

19
Zubin Shah

Comme Abid l'a mentionné, la valeur d'intervalle est interprétée dans le contexte du modèle spécifié dans filePattern. Cela commence par la plus basse dénomination. Par exemple, si le motif contient S, la fréquence sera en milliseconde. Il prend en charge le modèle de date décrit en détail dans SimpleDateFormat Java doc http://docs.Oracle.com/javase/7/docs/api/Java/text/SimpleDateFormat.html

5
rajnish

Log4j documentations :

intervalle -> (entier) À quelle fréquence un survol devrait-il avoir lieu en fonction du plus grand nombre unité de temps spécifique dans le modèle de date. Par exemple, avec une date motif avec heures comme élément le plus spécifique et incrément de 4 les renversements se produiraient toutes les 4 heures. La valeur par défaut est 1.

Vous devez modifier le modèle de nom de fichier si vous souhaitez le créer toutes les heures.

4
Amin Sh

Vous avez un fichier journal non vide (sinon il n'y a rien à survoler)?

Notez que même si le nom est "TimeBased ...", il ne sera pas transféré à l'heure spécifiée, mais au premier événement de journal arrivé après le dépassement du seuil de temps. Pouvez-vous essayer avec un petit programme de test qui enregistre quelque chose après 61 minutes environ et voir si le problème persiste?

Si cela ne fonctionne pas avec le programme de test ci-dessus, vous avez peut-être trouvé un bogue. Dans ce cas, veuillez le relever dans le suivi des problèmes de log4j. (Assurez-vous de joindre le programme de test que l'équipe peut utiliser pour reproduire le problème).

2
Remko Popma

Selon votre configuration TimeBasedTriggeringPolicy, l'enregistreur ne créera les journaux que tous les jours, pas toutes les heures.

J'ai modifié votre config.xml. Essaye ça

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
   <Appenders>
      <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd}-%i.log.gz">
         <PatternLayout>
            <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
         </PatternLayout>
         <Policies>
            **
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            **
            <SizeBasedTriggeringPolicy size="250 MB" />
         </Policies>
      </RollingFile>
   </Appenders>
   <Loggers>
      <Root level="error">
         <AppenderRef ref="RollingFile" />
      </Root>
   </Loggers>
</Configuration>

Pour plus de détails, consultez this

J'espère que ça marchera pour vous aussi. 

0
Akshay Kumar