2015-03-17 9 views
8

Python hat seine eigene RotatingFileHandler, die Protokolldateien automatisch rotieren soll. Als Teil einer Linux-Anwendung, die ihre Protokolldatei alle paar Wochen/Monate rotieren müsste, frage ich mich, ob es anders ist, als eine Konfigurationsdatei in logrotate.d zu haben und stattdessen eine WatchedFileHandler zu verwenden.Gibt es einen Unterschied zwischen RotatingFileHandler und logrotate.d + WatchedFileHandler für Python-Log-Rotation?

Gibt es einen Unterschied in der Funktionsweise? Ist eine Methode sicherer, effizienter oder besser als die andere?

+0

'logrotate.d' hängt davon ab, dass der Logger seinen Dateizeiger bei jedem Log-Ereignis schließt und wieder öffnet. Ich bin mir nicht sicher, ob der Standard-Python-Logger das tut. – tdelaney

+0

@tdelaney es nicht, aber es gibt eine gute Alternative innerhalb 'Logging', siehe unten in meiner Antwort – goncalopp

+0

Ich bemerkte, dass Sie Ihre Frage bearbeitet, um' WatchedFileHandler' zu erwähnen. Meinst du "RotatingFileHandler"? – goncalopp

Antwort

6

Was ist die Zielgruppe Ihres Programms?

Wenn Sie eine Desktop-Anwendung erstellen und von den meisten Benutzern nicht erwartet werden kann, dass sie die Protokolle lesen, sollten Sie sie behandeln. Nicht nur rotierende, sondern auch alte löschen - Sie wollen nicht die Festplatte des armen Benutzers füllen!

Auf der anderen Seite, wenn die Zielgruppe erfahrene UNIX-Systemadministratoren sind, müssen Sie einen anderen Ansatz wählen.

Sysadmins benötigen Funktionen, die Sie nicht erwarten können. Senden Sie sie per E-Mail, schreiben Sie sie in Append-Only-Speicher, Sie nennen es. Für diese Zielgruppe ist es am besten, wenn Ihre Protokollierung so flexibel wie möglich ist. Flexibel (in UNIX) bedeutet einfach - schreiben Sie einfach in eine Datei und betrachten Sie sie als erledigt.

Auch Sysadmins wollen nicht wieder lernen, wie wieder Logging zu tun. Auch wenn Sie diese Art von Funktion bereitstellen möchten, stellen Sie sicher, dass der Standardwert innerhalb dieser Annahme angemessen ist.

Endlich. Tdelaney hat einen wichtigen Punkt angesprochen: Der Standard FileHandler schenkt der Datei, auf die er schreibt, nicht viel Aufmerksamkeit. Sie sollten einen WatchedFileHandler verwenden, der speziell für diesen Zweck geschrieben wurde.

+0

Das ist ein gutes Argument für die 'syslog'- und' NTEventLog'-Handler, die sich an den erwarteten Stellen anmelden. Die App sollte keinen Schreibzugriff auf '\ var \ log' haben, kann aber ihre Logs trotzdem über die Standard-Syslog-Aufrufe schreiben. – tdelaney

+0

Guter Punkt, es ist nicht direkt meine Frage. Aber ich nehme an, du meinst, dass Fortgeschrittene * nix-Benutzer erwarten würden, dass ein Log-Drehmechanismus von Logrotate gehandhabt wird, wenn überhaupt? – devhallo

+0

@tdelaney 'syslog' und' NTEventLog' sind in der Tat eine bessere Wahl, wenn Sie Code für verschiedene Plattformen explizit schreiben wollen – goncalopp

1

Mit RotatingFileHandler kann eine Protokolldatei auf die Größe N wachsen und dann sofort und automatisch in eine neue Datei rotiert werden.

logrotate.d läuft normalerweise einmal pro Tag. Wenn Sie die Größe einer Protokolldatei einschränken möchten, ist logrotate.d nicht besonders hilfreich, da sie nur in regelmäßigen Abständen ausgeführt wird.

+0

Sie sollten beachten, dass Logrotate hat eine Größe Option, die ein Protokoll drehen wird, sobald es erreicht/überschreitet eine feste Größe. Referenz-Website: http://www.thegeekstuff.com/2010/07/logrotate-examples/ – Mayhem

+0

Aber logrotate führt die Rotation nur dann durch, wenn es während der eingestellten Zeit läuft. Es gibt also eine Verzögerungsperiode, in der das Protokoll weiter wachsen kann. Das Ändern von logrotate, um stündlich zu laufen, wird dies natürlich etwas mildern. – pfctdayelise