Log4j tägliche Rotation und monatliche Aufbewahrung mit jedem Datei-Appender

11

Ist es mit jedem der log4j-Appender möglich, die Protokolle mit einer bestimmten Rotationszeit und einem bestimmten Aufbewahrungslimit zu schreiben?
Das Ziel wäre:

  • für jeden Tag eine Protokolldatei zu haben; Erstellen Sie um Mitternacht eine neue Datei für die neuen Protokolle
  • die Protokolldateien zu behalten und sie nach einer bestimmten Zeit automatisch zu löschen; Löschen Sie daher Protokolldateien, die älter als X Tage sind (z. B. 30 Tage).

Es scheint, dass die Rotation möglich ist, aber die Begrenzung der Retentionszeit ist mit log4j nicht möglich

Die log4j-Version ist 1.2.

PaulEdison
quelle

Antworten:

4

Diese log4J-Eigenschaften funktionieren für mich

log4j.rootLogger=DEBUG, stdout, file

# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Redirect log messages to a log file, support file rolling.
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=/opt/cronjob/logs/cronlogs.log
log4j.appender.file.MaxFileSize=1028MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Basharat Ali
quelle
4

Meine Antwort basiert auf logback, nicht log4j(Entschuldigung für die Verwirrung ..)


Sie können diese Protokollrotation mithilfe von erreichen TimeBasedRollingPolicy.

zum Beispiel)

<appender name="SYSTEMLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <file>./logs/system.log</file>
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>./logs/system.log.%d{yyyy-MM-dd}</fileNamePattern>
    <!-- keep last 30 days of logs -->
    <maxHistory>30</maxHistory>
  </rollingPolicy>
  <encoder>
    <charset>UTF-8</charset>
      <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %msg %n</Pattern>
  </encoder>
</appender>

Es dreht sich um Mitternacht und löscht Protokolldateien, die älter als 30 Tage sind.

fileNamePattern: Der Rollover-Zeitraum wird aus dem Wert von fileNamePattern abgeleitet

maxHistory: Die optionale Eigenschaft maxHistory steuert die maximale Anzahl von Archivdateien, die aufbewahrt werden sollen, und löscht ältere Dateien asynchron. Wenn Sie beispielsweise einen monatlichen Rollover angeben und maxHistory auf 6 setzen, werden Archivdateien im Wert von 6 Monaten gespeichert, wobei Dateien, die älter als 6 Monate sind, gelöscht werden. Beachten Sie, dass beim Entfernen alter archivierter Protokolldateien alle Ordner, die zum Zweck der Archivierung von Protokolldateien erstellt wurden, entsprechend entfernt werden.

Sie können weitere Informationen zu TimeBasedRollingPolicy überprüfen

Tonarimochi
quelle
@PaulEdison Nur neugierig, funktionieren diese Konfigurationen nicht?
JavaGroup456
1
Diese Lösung basiert auf Logback nicht log4j
benbenw
Wow .... @benbenw ist richtig !! Ich verstehe nicht, warum ich diese Frage als Rückmeldung missverstanden habe ..... Danke, dass Sie mich daran erinnert haben. Bitte beziehen Sie sich auf seine / ihre Antwort für log4j.
Tonarimochi
3

ja wir können!

Datei: project->src->main->resources->logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">

  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>folderName/logFile.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>folderName/archive/logFile.%d{dd-MM-yyyy}.log</fileNamePattern>
      <!-- keep last 30 days of logs -->
      <maxHistory>30</maxHistory>
    </rollingPolicy>

    <!-- filter by level (optional) -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>DEBUG</level>
    </filter>

    <encoder>
      <pattern>%date %-5level [%thread] %file:%L [%M] - %msg%n</pattern>
    </encoder>
  </appender>

  <!-- you can filter by type of level (optional) -->
  <root level="DEBUG">
    <appender-ref ref="FILE"/>
  </root>
</configuration>

Weitere Informationen finden Sie in der Dokumentation: TimeBasedRollingPolicy

JavaDoc: TimeBasedRollingPolicy

Aymen
quelle
1

Die meisten Antworten basieren auf Logback. Aber die Frage ist über log4j 1.2 (alt ...)

Die Antwort mit DailyRollingFileAppender funktioniert ebenfalls nicht. org.apache.log4j.DailyRollingFileAppenderunterstützt die MaxBackupIndexEigenschaft nicht siehe http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.html (dies ist für RollingFileAppender)

Sie könnten interessiert sein an: Verwenden Sie MaxBackupIndex in DailyRollingFileAppender -log4j

und für eine mögliche Antwort: Log4j Rollingpolicy und MaxbackupIndex

Aber Sie sollten wahrscheinlich die "Emulation" von slf4j log4j ( http://www.slf4j.org/legacy.html#log4j-over-slf4j ) verwenden und Ihr Protokoll durch Logback (ohne Codeänderung) weiterleiten, wo es viel einfacher zu implementieren ist .

benbenw
quelle