2016-01-09 51 views
5

Co chcę jest:Jak usunąć starsze wątki nad dziennikami log4j2, zachowując do 10 plików?

  • maksymalnie 10 plików dziennika, w całkowitej
  • każdego pliku dziennika, nie więcej niż 50 MB wielkości.

Tym samym folder logów nigdy się nie rozrasta (50 MB * 10) = 500 MB.

Ale wygląda na to, że moja konfiguracja log4j2 nie została poprawnie wykonana.

Co się dzieje jest:

  • Logi nie przewrócić po 50 MB
  • Ale są zapisu do 10 logi przechowywane dziennie
  • Tak więc nie ma limitu liczby plików dziennika przechowywane w folderze log (od na przykład w ciągu 2 dni, 20 kłody 50mb każdym zebraniu)

Oto konfiguracji:

<Configuration status="WARN"> 
    <Appenders> 
     <RollingFile name="RollingFile" fileName="log/my.log" filePattern="log/my-%d{MM-dd-yyyy}-%i.log"> 
      <PatternLayout> 
       <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> 
      </PatternLayout> 
      <Policies> 
       <OnStartupTriggeringPolicy /> 
       <TimeBasedTriggeringPolicy /> 
       <SizeBasedTriggeringPolicy size="50 MB"/> 
      </Policies> 
      <DefaultRolloverStrategy max="10"/> 
     </RollingFile> 
    </Appenders> 
    <Loggers> 
     <Root level="info"> 
      <AppenderRef ref="RollingFile"/> 
     </Root> 
    </Loggers> 
</Configuration> 

Co robię źle?

Odpowiedz

4

Od 2.5 Log4j obsługuje custom Delete action, który jest wykonywany na każdym przejściu.

Można kontrolować, które pliki są usuwane przez:

  1. Nazwa (Dopasowywanie glob lub regex)
  2. Age ("delete jeśli 14 dni lub starszych")
  3. Count ("keep tylko najnowsza 3 „)
  4. Rozmiar (” zachować tylko najnowsze pliki do 500 MB ")

Powyższe można łączyć. Zamiast określać tylko warunek rozmiaru, aby ograniczyć użycie dysku do maksimum 500 MB, dobrze jest również dopasować nazwę, aby nie przypadkowo usunąć niepowiązane pliki.

Użytkownicy, którzy potrzebują jeszcze dokładniejszej kontroli nad plikami do usunięcia, mogą określić warunek skryptu przy użyciu dowolnego obsługiwanego języka skryptowego JSR-223.

Proszę sprawdzić documentation, ma trzy pełne przykłady, które mogą być przydatne.

za pytanie, ten fragment może działać:

<DefaultRolloverStrategy> 
    <!-- 
     * only files in the log folder, no sub folders 
     * only rolled over log files (name match) 
     * either when more than 10 matching files exist or when the max disk usage is exceeded 
    --> 
    <Delete basePath="log" maxDepth="1"> 
     <IfFileName glob="my-??-??-????-*.log"> 
     <IfAny> 
      <IfAccumulatedFileSize exceeds="500 MB" /> 
      <IfAccumulatedFileCount exceeds="10" /> 
     </IfAny> 
     </IfFileName> 
    </Delete> 
    </DefaultRolloverStrategy> 

Na marginesie należy zauważyć, że można compress log files on rollover aby je zajmują mniej miejsca na dysku.

Wreszcie, bądź ostrożny! W ten sposób nie można odzyskać plików usuniętych. :-)

+0

jakikolwiek sposób zrobić w log4j 2.1? –

+0

Nie jako funkcja Log4j. Będziesz musiał napisać coś, co usunie stare logi z twojego systemu operacyjnego ... –

+1

Zdecydowanie jednak zalecamy aktualizację. Każdy powód, dla którego nie możesz dokonać aktualizacji? –

1

The TimeBasedTriggeringPolicy działa w oparciu o filePattern.Zasadniczo najmniejsza jednostka czasu we wzorcu pliku (%d) jest interwałem czasu wyzwalania. W twoim przypadku wartość to "dd", dlatego polityka jest uruchamiana każdego dnia.

Obecność% i w Twoim filePattern utrzymuje wiele plików dzienników przez jeden dzień. Polecam próbować bez %i w filePattern.