11

Kontext:log4j FileAppender schaltet nicht in die neue Datei, wenn logrotate die Datei log dreht

Ich möchte log4j verwenden prüfungsbezogene Protokolle an eine bestimmte Protokolldatei zu schreiben, sagen wir mal audit.log. Ich möchte nicht syslogappender (udp based) verwenden, weil ich nicht tolerant gegenüber Datenverlust sein will. Außerdem verwende ich logrotate, um das audit.log zu rotieren, wenn die Datei eine bestimmte Größe erreicht.

Problem:

mir begegnet ist, ist, dass, wenn logrotate die audit.log Datei dreht sich um audit.log.1, log4j andere audit.log.1 hält das Schreiben als die audit.log Schreiben .

Mögliche Ansätze:

  1. Ich weiß, ich RollingFileAppender können Sie die Log-Rotation außer Gebrauch logrotate zu tun, also wenn RollingFileAppender die Datei rollt, schalten Sie es in die neue Datei ohne Probleme. Aber der Grund, warum ich rollingfileappender nicht benutzen kann, ist, dass ich die rotierende Funktion von logrotate benutzen möchte, um einige Skripte nach der Rotation auszulösen, die nicht durch rollingfileappender bereitgestellt werden können.

  2. Eine weitere verzweifelte Möglichkeit, die ich mir vorstellen kann, ist selbst einen log4j angepassten Appender zu schreiben, um die Protokolldatei (audit.log.1) zu schließen und den neuen zu öffnen (audit.log), wenn die Datei rotiert wird.

  3. Ich habe nie ExternallyRolledFileAppender verwendet, aber wenn es möglich ist, root logrotate zu verwenden, um das Signal an ExternallyRolledFileAppender zu senden und log4j bewusst machen, die Datei gedreht wird, und zu schreiben in die neue Datei?

Frage:

Nur frage mich, gibt es einige appender wie das bereits erfunden/geschrieben? oder habe ich andere Möglichkeiten, dies zu lösen?

+0

Perfekte Weise eine Frage +1 – Deepak

Antwort

5

Check out logrotate ‚s copytruncate Option, könnte es Ihren Fall helfen:

copytruncate 
     Truncate the original log file to zero size in place 
     after creating a copy, instead of moving the old log 
     file and optionally creating a new one. It can be 
     used when some program cannot be told to close its 
     logfile and thus might continue writing (appending) to 
     the previous log file forever. Note that there is a 
     very small time slice between copying the file and 
     truncating it, so some logging data might be lost. 
     When this option is used, the create option will have 
     no effect, as the old log file stays in place 
+0

Aus irgendwelchen Gründen zu fragen, kann ich nicht copytruncate in meinem Fall verwenden. Wenn ich dir das erkläre, brauche ich eine halbe Stunde, um es zu schreiben :) also irgendwelche anderen Optionen, die ich habe? – Shengjie

+1

Fühlen Sie sich frei, eine halbe Stunde zu nehmen ... :) @Shengjie – rogerdpack

+1

Vielleicht ist es die nächste Passform, aber es löst nicht das Problem, wie durch copytruncate Logdaten möglicherweise verloren gehen. Gibt es wirklich keine Möglichkeit, einer Log4j-App mitzuteilen, ihre Logfile-Handles wieder zu öffnen? –