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
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'
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);
Face à plus de problèmes tout en faisant ce travail. Voici les détails:
Apache-log4j-extras-1.1.jar
dans le classpath, ne l’a pas remarqué au début.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].
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>
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.
En ce qui concerne l'erreur: log4j:ERROR Element type "rollingPolicy" must be declared
log4j.dtd
définissant rollingPolicy
.Apache-log4j-extras-1.1.jar
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
Vous avez un mauvais nom de package
org.Apache.log4j.rolling.RollingFileAppender
Le bon est:
org.Apache.log4j.RollingFileAppender
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.