2014-07-03 19 views
15

Ich habe eine RollingRandomAccessFileAppender mit nur der OnStartupTriggeringPolicy-Set konfiguriert, aber wenn ich das Attribut max der DefaultRolloverStrategy auf eine Nummer setzen, generieren die Protokolle weiterhin über diesen Betrag auf unbestimmte Zeit.Wie funktioniert Log4j2 DefaultRolloverStrategy max Attribut wirklich?

Hier ist mein log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN"> 
    <Appenders> 
     <Console name="Console" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
     </Console> 
     <RollingRandomAccessFile 
      name="RollingRAF" 
      fileName="logs/app.log" 
      filePattern="logs/app-%d{[email protected]}.log"> 
      <PatternLayout> 
       <Pattern>%d %p %c{1.} %m%n</Pattern> 
      </PatternLayout> 
      <Policies> 
       <OnStartupTriggeringPolicy /> 
      </Policies> 
      <DefaultRolloverStrategy max="5"/> 
     </RollingRandomAccessFile> 
    </Appenders> 
    <Loggers> 
     <Logger name="myLogger" level="warn"> 
      <AppenderRef ref="RollingRAF"/> 
     </Logger> 
     <Root level="error"> 
      <AppenderRef ref="Console"/> 
     </Root> 
    </Loggers> 
</Configuration> 

Ist es, weil ich nicht einen Iterator in meinem Namen Muster haben?

Liegt das daran, dass die Genauigkeit meines Dateinamens auf Sekunden eingestellt ist?

Ist es, weil ich nur die OnStartupTriggeringPolicy gesetzt habe?

Oder was ist hier los?

Mein Ziel war es, eine rollende Konfiguration einzurichten, die die letzten 5 Anwendungsläufe protokolliert.

+0

Sollten Sie '' verwenden, da Sie Datum im Namensmuster verwenden? – Sionnach733

+2

@ Sionnach733 Hinzufügen/Ändern, das ändert sich nicht viel, es erzeugt unbegrenzte Protokolle. Wenn ich einen Iterator% i hinzufüge und die Genauigkeit auf einen Punkt reduziere, wo ich 5 Logs mit derselben Genauigkeit erzeugen kann, dann überschreibt er alte Logs wie erwartet (zB wenn die Präzision auf Minuten eingestellt ist und ich 5 Logs in 1 Minute erzeuge) , aber sobald sich das Datum ändert (nächste Minute kommt), wird es erlauben, 5 weitere Protokolle zu generieren. Im Idealfall wollte ich nur das Datum im Dateinamen für die Bequemlichkeit nicht Funktionalität, da ich einfach das Datum aus dem Namen weglassen und mit einem einfachen Iterator gehen kann, um zu erreichen, was ich will. –

+1

Ich habe das gleiche Verhalten beobachtet und stimme @ Ceiling-Gecko zu, das Max-Attribut auf DefaultRolloverStrategy appredly gilt nur für den Iterator und der Iterator nur iteriert, wenn der verbleibende Dateiname wiederholt wird, daher scheint es mir nicht möglich, automatisch - Entfernen Sie alte Protokolldateien, wenn sich die Namen unterscheiden. Dennoch ist es wirklich seltsam, dass diese Funktionalität nicht existiert, wenn die API so häufig für so viele Leute verwendet wird ... –

Antwort

12

Die DefaultRolloverStrategy verwendet das in filePattern angegebene Datumsmuster, wenn eine TimeBasedTriggeringPolicy angegeben wird. Um das max-Attribut zu verwenden, geben Sie im Dateimuster ein %i-Muster an und fügen Sie den Rollover-Richtlinien <SizeBasedTriggeringPolicy size="20 MB" /> hinzu. (Oder eine andere Größe natürlich.)

Der Wert für max in <DefaultRolloverStrategy max="5"/> wird dann sicherstellen, dass innerhalb der gleichen Rollover-Periode (eine Sekunde für Sie, seit Sie ein Datumsmuster von %d{[email protected]} angegeben haben) nicht mehr als 5 Dateien erstellt werden wenn ein größenbasierter Rollover ausgelöst wurde.

Dies ist sinnvoller, wenn Ihr Rollover-Fenster länger ist, wie ein täglicher Wechsel zu einem neuen Ordner, und stellen Sie sicher, dass innerhalb dieses Ordners nicht mehr als 5 Dateien mit max. Größe = 20 MB erstellt werden.


Update:

Log4j 2.5 hinzugefügt, um die Fähigkeit custom delete actions zu konfigurieren. Out-of-the-Box können Sie Dateien basierend auf Alter, Anzahl oder wie viel Speicherplatz sie aufnehmen (akkumulierte Dateigröße) löschen.

+0

Gibt es vielleicht eine Möglichkeit, dem Namensmuster einen Zeitstempel hinzuzufügen, den die Rollover-Strategie als reinen Text ignoriert? Auf diese Weise könnte ich einfach ein% i am Ende des Musters hinzufügen und es wird dann nur auf das% i schauen und das Datum ignorieren, wenn ich zu einer neuen Datei rolle. Ich sah in der Dokumentation ein Muster wie '$$ {date: [email protected]}', aber es scheint, dass es analog zum '% d'-Muster ist. –

+0

Ich bin mir nicht sicher, ob ich das richtig verstehe, aber wie wäre es mit einer sehr großen Rollover-Periode wie jedes Jahr oder jede Ära '$$ {date: G}'? –

+5

Ja, das verstehe ich. Es würde mir nichts ausmachen, nur mit dem "log/app-% i.log" -Muster zu gehen, ich dachte nur, dass es vielleicht einen Weg gibt, einen Zeitstempel für die persönliche Betrachtung einzubauen. –