Drehen Sie eine Datei, die geöffnet ist und jederzeit geschrieben wird

10

Ich habe eine Linux-Anwendung, die ständig Protokollinformationen in eine Protokolldatei schreibt, z. /var/log/application.log. Da die Anwendung die Datei nicht automatisch dreht, kann diese Protokolldatei in einigen Wochen eine Größe von Gigabyte erreichen. Daher möchte ich diese Datei ordnungsgemäß drehen können

Mein Hauptanliegen hierbei ist, dass ich zum Drehen einer Datei, die von der Anwendung jederzeit geöffnet wird, wahrscheinlich Folgendes tun muss:

  1. Verschieben Sie die Datei in ihre gedrehte Form /var/log/application.log -> /var/log/application.log.2013-01-28

  2. Erstellen Sie eine leere /var/log/application.log. Obs: Zu diesem Zeitpunkt schreibt der Bewerbungsprozess noch an/var/log/application.log.2013-01-28

  3. Ändern Sie den Dateideskriptor des Anwendungsprozesses, um erneut darauf zu verweisen /var/log/application.log

Also, habe ich recht? Wenn ja, wie kann ich das machen? (hauptsächlich das Ändern des Dateideskriptorteils)

Wenn nicht, was ist der richtige Weg und wie geht das?

Bruno Polaco
quelle
Müssen Sie die Datei löschen oder nur drehen?
ewwhite
Welche Anwendung? Die Anwendung muss Unterstützung bieten, um dies ordnungsgemäß durchzuführen. (Andernfalls können Sie eine sehr hässliche Sache tun - an den Prozess anhängen, die neue Datei öffnen, dup2den neuen Deskriptor über dem alten, dann den neuen Deskriptor schließen.)
David Schwartz
Interessanter Ansatz Schwartz. Ich bin neugierig, das in Aktion zu sehen und werde eine Weile damit spielen. Wie auch immer, die Anwendung ist im Haus und ich suche nach einer allgemeineren Lösung. Ich mag übrigens kormocs Antwort
Bruno Polaco
@ewwhite Ich muss es drehen, ich kann es mir nicht leisten, die Protokolldaten zu verlieren
Bruno Polaco

Antworten:

11

Schreiben Sie eine logrotatezu verwendende Konfigurationcopytruncate

copytruncate
    Truncate the original log file 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.
RS
quelle
Interessant, das Abschneiden der Datei nach dem Kopieren scheint trotz der Datenverlustspanne ziemlich clever zu sein. Ich habe diese Option bei logrotate nicht bemerkt. Danke für den Einblick :)
Bruno Polaco
1

Die meisten dieser Anwendungen reagieren auf ein Signal, z. B. SIGHUP, und schließen ihre Protokolldateien beim Empfang des Signals und öffnen sie erneut. Überprüfen Sie die Dokumentation Ihrer Anwendung auf das richtige zu sendende Signal.

Michael Hampton
quelle
Wenn dies nicht der Fall ist, können Sie die Anwendung als Fallback neu starten. Das macht Syslog normalerweise und einige andere Programme.
LSD