Configurazione di RollingFileAppender in log4j

Sto lavorando a una serie di servizi Web e vorremmo avere un registro ruotato ogni giorno.

Sto cercando di ottenere org.apache.log4j.rolling.RollingFileAppender dal compagno extra di log4j, poiché la documentazione suggerisce che questo è il migliore per gli ambienti di produzione.

Ho sia la libreria log4J principale ( log4j-1.2.15.jar ) che la libreria extra di log4j ( apache-log4j-extras-1.1.jar ) sul classpath.

Ho la seguente configurazione per l’appender nel file log4j.properties :

 ### 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 

Tuttavia, quando avvio il servizio Web con log4j in modalità debug, ricevo questi messaggi di errore:

 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. 

Ho trovato documentazione su come configurare questo appender un po ‘scarso, quindi qualcuno può aiutarmi a correggere la mia configurazione?

EDIT0: Aggiunto l’output della modalità di debug, piuttosto che solo gli avvisi standard

Secondo Log4jXmlFormat non è ansible configurarlo con log4j.properties, ma solo utilizzando il formato di configurazione XML:

Si noti che TimeBasedRollingPolicy può essere configurato solo con xml, non con log4j.properties

Sfortunatamente, l’esempio log4j.xml fornito non funziona neanche:

 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' 

Ho avuto un problema simile e ho appena trovato un modo per risolverlo (passando da log4j-extras fonte di log4j-extras , non di meno …)

La buona notizia è che, a differenza di quanto scritto ovunque, si scopre che in realtà è ansible configurare TimeBasedRollingPolicy usando log4j.properties (la configurazione XML non è necessaria!) Almeno nelle versioni di log4j> 1.2.16 si veda questo bug report )

Ecco un esempio:

 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 

A proposito il bit ${instanceId} è qualcosa che sto usando su Amazon EC2 per distinguere i log da tutti i miei lavoratori – ho solo bisogno di impostare quella proprietà prima di chiamare PropertyConfigurator.configure() , come segue:

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

Affrontare più problemi durante l’esecuzione di questo lavoro. Ecco i dettagli:

  1. Per scaricare e aggiungere apache-log4j-extras-1.1.jar nel classpath, all’inizio non lo si è notato.
  2. RollingFileAppender deve essere org.apache.log4j.rolling.RollingFileAppender anziché org.apache.log4j.RollingFileAppender . Questo può dare l’errore: log4j:ERROR No output stream or file set for the appender named [file].
  3. Abbiamo dovuto aggiornare la libreria log4j-1.2.14.jar da log4j-1.2.14.jar a log4j-1.2.16.jar .

Di seguito è la configurazione dell’appender che ha funzionato per me:

            

Toolbear74 è giusto log4j.XML è richiesto. Per ottenere il XML per la convalida, i tag devono essere PRIMA di Suggerisco di impostare una soglia di registrazione

Quando si crea un file Log4j.xml non dimenticare di copiare log4j.dtd nella stessa posizione.

Ecco un esempio:

                    

Considerando che l’impostazione di un FileNamePattern e di un ActiveFileName penso che l’impostazione di una proprietà File sia ridondante e possibilmente errata

Prova a rinominare log4j.properties e rilasciare un log4j.xml simile al mio esempio e vedere cosa succede.

Riguardo all’errore: log4j:ERROR Element type "rollingPolicy" must be declared

  1. Utilizzare una versione log4j.jar più nuova di log4j-1.2.14.jar, che ha un log4j.dtd definisce rollingPolicy .
  2. ovviamente è necessario anche apache-log4j-extras-1.1.jar
  3. Controlla se altri vasi di terze parti che stai usando posseggono forse una versione precedente di log4j.jar. In tal caso, assicurarsi che il file log4j.jar venga prima nell’ordine prima che la terza parte contenga il log4j.jar precedente.

In Log4j2, la lib “extra” non è più obbligatoria. Anche il formato di configurazione è cambiato.

Un esempio è fornito nella documentazione di 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 

Sono sospetto della proprietà ActiveFileName . Secondo log4j javadoc, non esiste una proprietà di questo TimeBasedRollingPolicy class TimeBasedRollingPolicy . (Nessun setActiveFileName o getActiveFileName ).

Non so cosa farebbe la specifica di una proprietà sconosciuta, ma è ansible che causi l’abbandono dell’object contenitore e che ciò possa portare agli avvisi che hai visto.

Prova a lasciarlo fuori e vedere cosa succede.

Hai un cattivo nome del pacchetto

 org.apache.log4j.rolling.RollingFileAppender 

Quello corretto è:

 org.apache.log4j.RollingFileAppender