wake-up-neo.net

Zeitbasierte Auslöserichtlinie in log4j2

Ich versuche, stündlich neue Protokolldateien zu erstellen. Ich benutze TimeBasedTriggerringPolicy von lo4j2 in RollingFileAppender. Nachfolgend finden Sie den Beispielcode für die XML-Konfiguration, den ich von der offiziellen log4j2-Site entnommen habe.

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

Im Intervallattribut habe ich 1 gesetzt, was 1 Stunde bedeutet .. Dennoch wird meine Datei nicht alle 1 Stunde gerollt.

Bitte helfen Sie mir, einen Fehler zu finden.

Hinweis: Ich habe Beta9 von log4j2 (das ist das neueste) enthalten.

12
user1890780

1 bezeichnet hier 1 Tag und nicht 1 Stunde. Ich habe die Konfiguration unten manuell getestet.

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

Zum manuellen Testen ändere ich Datum und Uhrzeit des Systems ... __ Versuchen Sie es zunächst mit einer Erhöhung von 1 Stunde. Die Protokolldateien werden generiert, jedoch nicht wie erwartet. Dann ändern Sie das Systemdatum, erhöhen Sie sich um 1 Tag und sehen Sie sich die Ergebnisse an.

Angenommen, die letzte Protokolldatei (abc.log) an Tag 29-Okt ist 50 KB. Die Konfigurationsgröße beträgt 100 KB. Wenn wir den Tag ändern (um 1 Tag erhöhen) und dann ausführen ..__, dann wird die letzte Datei in 29-Oct- (einige Folgenummern) .log (50 KB-Datei beim Kopieren) umbenannt, und die neue Datei wird erstellt erstellt mit abc.log

Ich habe dies mit einem einfachen Servlet mit der folgenden Konfiguration in web.xml versucht

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

bewahren Sie log4j2.xml im src-Ordner auf. log4j2.xml wird nicht geladen, wenn wir es im Klassenpfad behalten.

19
Zubin Shah

Wie bereits erwähnt, wird der Intervallwert im Kontext eines Musters interpretiert, das als Teil von filePattern angegeben ist. Es beginnt mit der niedrigsten Stückelung. Wenn das Muster beispielsweise S enthält, wird die Frequenz in Millisekunden angegeben. Es unterstützt das Datumsmuster, das im Rahmen von SimpleDateFormat Java doc http://docs.Oracle.com/javase/7/docs/api/Java/text/SimpleDateFormat.html ausführlich beschrieben wird.

5
rajnish

Log4j Dokumentationen :

intervall -> (Ganzzahl) Wie oft sollte ein Rollover basierend auf den meisten .__ erfolgen. bestimmte Zeiteinheit im Datumsmuster. Zum Beispiel mit einem Datum Muster mit Stunden als das spezifischste Element und und Inkrement von 4 Überschläge würden alle 4 Stunden auftreten. Der Standardwert ist 1.

Sie sollten das Dateinamensmuster ändern, wenn Sie es jede Stunde erstellen möchten.

4
Amin Sh

Sie haben eine nicht leere Protokolldatei (sonst gibt es nichts zu rollen)?

Beachten Sie, dass der Name zwar "TimeBased ..." lautet, er wird jedoch nicht zur angegebenen Zeit überschrieben, sondern beim ersten Protokollereignis, das eintritt, nachdem der Zeitschwellenwert überschritten wurde. Können Sie es mit einem kleinen Testprogramm versuchen, das nach etwa 61 Minuten etwas protokolliert und ob das Problem weiterhin auftritt?

Wenn das obige Testprogramm nicht läuft, haben Sie möglicherweise einen Fehler gefunden. In diesem Fall sollten Sie den Log4j-Issue-Tracker verwenden. (Stellen Sie sicher, dass Sie das Testprogramm beifügen, mit dem das Team das Problem reproduzieren kann.).

2
Remko Popma

Entsprechend Ihrer TimeBasedTriggeringPolicy-Konfiguration füllt der Logger die Protokolle nur jeden Tag und nicht jede Stunde auf. AFAIK, Sie können die Funktionalität erreichen, indem Sie das filePattern von HH (Stunden) in dd (Tage) ändern.

Ich habe Ihre config.xml geändert. Versuche dies

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

Für weitere Details überprüfen Sie this

Ich hoffe, das wird auch für Sie trainieren. 

0
Akshay Kumar