web-dev-qa-db-fra.com

Configuration de RollingFileAppender dans log4j

Je travaille sur un ensemble de services Web et nous aimerions avoir un journal journalier avec rotation.

J'essaie d'obtenir org.Apache.log4j.rolling.RollingFileAppender à partir du complément de log4j fonctionnant correctement, car la documentation suggère que cette méthode convient mieux aux environnements de production.

J'ai à la fois la bibliothèque log4J principale (log4j-1.2.15.jar) et la bibliothèque d’extras log4j (Apache-log4j-extras-1.1.jar) sur le chemin de classe.

J'ai la configuration suivante pour l'appender dans le log4j.properties fichier:

### SOAP Request Appender
log4j.appender.request=org.Apache.log4j.rolling.RollingFileAppender
log4j.appender.request.File=SOAPmessages.log
log4j.appender.request.RollingPolicy=org.Apache.log4j.rolling.TimeBasedRollingPolicy
log4j.appender.request.RollingPolicy.ActiveFileName =SOAPmessages-%d.log
log4j.appender.request.RollingPolicy.FileNamePattern=SOAPmessages-%d.log.Zip
log4j.appender.request.layout = org.Apache.log4j.PatternLayout
log4j.appender.request.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

Cependant, lorsque je démarre le service Web avec log4j en mode débogage, je reçois les messages d'erreur suivants:

log4j: Parsing appender named "request".
log4j: Parsing layout options for "request".
log4j: Setting property [conversionPattern] to [%d{ABSOLUTE} %5p %c{1}:%L - %m%n].
log4j: End of parsing for "request".
log4j: Setting property [file] to [/logs/SOAPmessages.log].
log4j:WARN Failed to set property [rollingPolicy] to value "org.Apache.log4j.rolling.TimeBasedRollingPolicy". 
log4j:WARN Please set a rolling policy for the RollingFileAppender named 'request'
log4j: Parsed "request" options.

J'ai trouvé la documentation sur la façon de configurer cet appender un peu clairsemé, alors quelqu'un peut-il m'aider à réparer ma configuration?

EDIT0: Sortie du mode débogage ajoutée, plutôt que simplement les avertissements standard

40
chrisbunney

Mise à jour: au moins dès 2013 (voir le commentaire de Mubashar), cela a commencé à fonctionner.


Selon Log4jXmlFormat vous ne pouvez pas le configurer avec log4j.properties, mais uniquement avec le format de configuration XML:

Notez que TimeBasedRollingPolicy peut uniquement être configuré avec XML, pas log4j.properties.

Malheureusement, l'exemple de log4j.xml fourni ne fonctionne pas non plus:

log4j:ERROR Parsing error on line 14 and column 76
log4j:ERROR Element type "rollingPolicy" must be declared.
...
log4j:WARN Please set a rolling policy for the RollingFileAppender named 'FILE'
16
toolbear

J'ai eu un problème similaire et je viens de trouver un moyen de le résoudre (en parcourant la source log4j-extras, Rien de moins ...)

La bonne nouvelle est que, contrairement à ce qui est écrit partout, il s'avère que vous POUVEZ réellement configurer TimeBasedRollingPolicy à l'aide de log4j.properties (configuration XML non nécessaire! Au moins dans les versions de log4j> 1.2.16 voir ceci rapport de bogue )

Voici un exemple:

log4j.appender.File = org.Apache.log4j.rolling.RollingFileAppender
log4j.appender.File.rollingPolicy = org.Apache.log4j.rolling.TimeBasedRollingPolicy
log4j.appender.File.rollingPolicy.FileNamePattern = logs/worker-${instanceId}.%d{yyyyMMdd-HHmm}.log

BTW, le bit ${instanceId} Est quelque chose que j'utilise sur l'EC2 d'Amazon pour distinguer les journaux de tous mes travailleurs. Je dois juste définir cette propriété avant d'appeler PropertyConfigurator.configure(), comme suit:

p.setProperty("instanceId", EC2Util.getMyInstanceId());
PropertyConfigurator.configure(p);
61
Pierre D

Face à plus de problèmes tout en faisant ce travail. Voici les détails:

  1. Pour télécharger et ajouter Apache-log4j-extras-1.1.jar dans le classpath, ne l’a pas remarqué au début.
  2. Le RollingFileAppender devrait être org.Apache.log4j.rolling.RollingFileAppender au lieu de org.Apache.log4j.RollingFileAppender. Cela peut donner l'erreur: log4j:ERROR No output stream or file set for the appender named [file].
  3. Nous avons dû mettre à jour la bibliothèque log4j de log4j-1.2.14.jar à log4j-1.2.16.jar.

Ci-dessous, la configuration d'appender qui a fonctionné pour moi:

<appender name="file" class="org.Apache.log4j.rolling.RollingFileAppender">
        <param name="threshold" value="debug" />
        <rollingPolicy name="file"
            class="org.Apache.log4j.rolling.TimeBasedRollingPolicy">
            <param name="FileNamePattern" value="logs/MyLog-%d{yyyy-MM-dd-HH-mm}.log.gz" />
            <!-- The below param will keep the live update file in a different location-->
            <!-- param name="ActiveFileName" value="current/MyLog.log" /-->
        </rollingPolicy>

        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%5p %d{ISO8601} [%t][%x] %c - %m%n" />
        </layout>
</appender>
20
James Jithin

Toolbear74 est correct log4j.XML est requis. Pour que le XML valide les balises <param>, Il est nécessaire AVANT que le <rollingPolicy>, Je suggère de définir un seuil de journalisation <param name="threshold" value="info"/>.

Lors de la création d'un fichier Log4j.xml, n'oubliez pas de copier le fichier log4j.dtd au même endroit.

Voici un exemple:

<?xml version="1.0" encoding="windows-1252"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
<!-- Daily Rolling File Appender that compresses old files -->
  <appender name="file" class="org.Apache.log4j.rolling.RollingFileAppender" >
     <param name="threshold" value="info"/>
     <rollingPolicy name="file"  
                      class="org.Apache.log4j.rolling.TimeBasedRollingPolicy">
        <param name="FileNamePattern" 
               value="${catalina.base}/logs/myapp.log.%d{yyyy-MM-dd}.gz"/>
        <param name="ActiveFileName" value="${catalina.base}/logs/myapp.log"/>
     </rollingPolicy>
     <layout class="org.Apache.log4j.EnhancedPatternLayout" >
        <param name="ConversionPattern" 
               value="%d{ISO8601} %-5p - %-26.26c{1} - %m%n" />
    </layout>
  </appender>

  <root>
    <priority value="debug"></priority>
    <appender-ref ref="file" />
  </root>
</log4j:configuration>

Considérant que vous définissez FileNamePattern et ActiveFileName, je pense que définir une propriété File est redondant et peut-être même erroné

Essayez de renommer votre log4j.properties et de déposer dans un log4j.xml similaire à mon exemple pour voir ce qui se passe.

4
Raystorm

En ce qui concerne l'erreur: log4j:ERROR Element type "rollingPolicy" must be declared

  1. Utilisez une version de log4j.jar plus récente que log4j-1.2.14.jar, qui a un log4j.dtd définissant rollingPolicy.
  2. bien sûr vous avez aussi besoin de Apache-log4j-extras-1.1.jar
  3. Vérifiez si une version plus ancienne de log4j.jar est emballée dans les fichiers jars tiers que vous utilisez. Si tel est le cas, assurez-vous que votre fichier log4j.jar figure en premier dans l'ordre précédant le tiers contenant l'ancien fichier log4j.jar.
3
Newbie

Dans Log4j2, la bibliothèque "extras" n'est plus obligatoire. Le format de configuration a également changé.

Un exemple est fourni dans le documentation Apache

property.filename = /foo/bar/test.log

appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = /foo/bar/rolling/test1-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 2
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 5


logger.rolling.name = com.example.my.class
logger.rolling.level = debug
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = RollingFile
2
alain.janinm

Vous avez un mauvais nom de package

org.Apache.log4j.rolling.RollingFileAppender 

Le bon est:

org.Apache.log4j.RollingFileAppender 
0
george

Je me méfie de la propriété ActiveFileName. Selon le journal javadoc de log4j, une telle propriété n'existe pas dans la classe TimeBasedRollingPolicy. (Aucune méthode setActiveFileName ou getActiveFileName.)

Je ne sais pas ce que spécifierait une propriété inconnue, mais il est possible que l'objet contenant soit abandonné, ce qui peut entraîner les avertissements que vous avez vus.

Essayez de le laisser et voir ce qui se passe.

0
Stephen C