Wie rotiere ich ein Protokoll basierend auf einem Intervall, wenn das Protokoll eine bestimmte Größe überschreitet?

20

Aus der Manpage von logrotate:

Minimale Größe
Protokolldateien werden gedreht, wenn sie größer als Byte sind, jedoch nicht vor dem zusätzlich angegebenen Zeitintervall (täglich, wöchentlich, monatlich oder jährlich). Die zugehörige Größenoption ist ähnlich, mit der Ausnahme, dass sie sich mit den Zeitintervalloptionen gegenseitig ausschließt und bewirkt, dass Protokolldateien unabhängig vom letzten Rotationszeitpunkt gedreht werden. Bei Verwendung von Min. Größe werden sowohl die Größe als auch der Zeitstempel einer Protokolldatei berücksichtigt.

Größe Größe
Protokolldateien werden gedreht, wenn sie größer als die Größe von Bytes werden. Wenn auf size k folgt, wird die Größe in Kilobyte angenommen. Wenn das M verwendet wird, ist die Größe in Megabyte und wenn G verwendet wird, ist die Größe in Gigabyte. So sind Größe 100, Größe 100k, Größe 100M und Größe 100Gare alle gültig.

Ich stelle die Größe auf 5M und das Intervall auf wöchentlich ein und denke, dass die Protokolle wöchentlich gedreht werden und eine zusätzliche Drehung auftreten würde, wenn die Größe des Protokolls 5M überschreitet. Es kommt jedoch vor, dass das Protokoll nur gedreht wird, wenn es 5 MB überschreitet. Dies scheint das zu sein, was minsize tun soll.

Interpretiere ich das Handbuch falsch? Wie lasse ich das Protokoll wöchentlich rotieren UND wenn es 5 Millionen überschreitet?

BEARBEITEN:

Ich bin mir nicht sicher, ob die folgenden Informationen relevant sind, sondern nur zur Ergänzung:

Ich benutze rsyslog, um die Hauptprotokollierung für Nachrichten, sicher, cron, maillog, boot zu machen. Im Folgenden sind das Rotationsdatum und die Dateigröße der vorletzten Protokolle aufgeführt, wobei Größe und Intervall wie oben beschrieben festgelegt werden:

filename  rotation date  file size
messages  20130129       5.3MB
secure    20130113       5.1kB
cron      20130113       3.6kB
maillog   20130113       1.1kB

Wie zu sehen ist, werden nur Nachrichten gedreht.

EDIT2:

Ich hätte nachfragen sollen man logrotate. Sie haben es tatsächlich mit der Option maxsize aktualisiert . Das sollte es sein, wonach ich suche:

Maximale Größe
Protokolldateien werden gedreht, wenn sie größer als die Größe von Bytes sind, auch vor dem zusätzlich angegebenen Zeitintervall (täglich, wöchentlich, monatlich oder jährlich). Die zugehörige Größenoption ist ähnlich, mit der Ausnahme, dass sie sich mit den Zeitintervalloptionen gegenseitig ausschließt und bewirkt, dass Protokolldateien ohne Berücksichtigung des letzten Rotationszeitpunkts gedreht werden. Wenn maxsize verwendet wird, werden sowohl die Größe als auch der Zeitstempel einer Protokolldatei berücksichtigt.

Fragenüberlauf
quelle

Antworten:

24

Hier werden einige Fragen beantwortet: Täglich logrotieren und Größe?

logrotateWird in der Regel nur einmal täglich ausgeführt, sodass die Größenbeschränkungen nicht genau eingehalten werden. logrotateIn der Statusdatei von werden (möglicherweise /var/lib/logrotate.status) nur Datumsangaben (keine Uhrzeitangaben) gespeichert. Sie ist nicht für eine häufigere Verwendung vorgesehen. Daher können Sie Dateien nicht einfach häufiger drehen ( Update : Version 3.85 bietet Unterstützung für Stunden und speichert einen vollständigen Zeitstempel in der Statusdatei .)

Sie sagen nicht, welche syslogdSie verwenden, rsyslog und syslog-ng unterstützen selbstverwaltete , größenbasierte Rotation. Sie sollten also in der Lage sein, diese nach Größe logrotatezu rotieren und wöchentlich zu rotieren (obwohl einige Überlegungen erforderlich sein könnten) Benennung von Dateien, um sicherzustellen, dass bei gleichzeitiger Dateirotation nicht versehentlich etwas gelöscht wird).

Eine andere Option ist die Verwendung von Pipe-Protokollen, genau wie Apache. Tatsächlich unterstützt Apache-2.4 rotatelogs genau diese Funktion (frühere Versionen unterstützen nur Größe oder Zeit unabhängig voneinander). Sie sagen nicht, woher die Protokolle stammen, aber Sie können sich möglicherweise bei einer Pipe oder einem Fifo anmelden und verwenden rotatelogs, wenn dies unterstützt wird.

Mit logrotate<= v3.8.0 sind die drei unterstützten Szenarien:

  1. Größe um Größe drehen, höchstens einmal täglich, unabhängig von der abgelaufenen Zeitspanne
  2. Die Zeitdauer wird unabhängig von der Größe bedingungslos um die Zeitdauer gedreht
  3. min & timeperiod Wenn die Größe der Protokolldatei min überschreitet, drehen Sie sie um die Zeitspanne. Eine häufige Verwendung ist "Min. 1", was bedeutet, dass 0-Byte-Protokolle nicht gedreht werden, wodurch die Unordnung minimiert wird.

logrotate-3.8.1 fügt hinzu:

  1. maxsize & timeperiod drehen, wenn die Größe maxsize überschreitet, oder nach Ablauf der Zeitspanne. logrotateIn diesem Fall muss möglicherweise mehr als die Standardeinstellung einmal pro Tag ausgeführt werden.

logrotate-3.8.5 fügt hinzu:

  1. stündliche Unterstützung und speichert einen vollständigen Zeitstempel in der Statusdatei. Sie sollten dafür logrotate(mindestens) stündlich laufen .
mr.spuratic
quelle
Bitte beachten Sie mein Update, danke für den Link. Scheint, als wäre ein wenig Skripting erforderlich? minsize scheint nicht sehr nützlich zu sein, ich frage mich, warum sie es anstelle von maxsize haben.
Fragenüberlauf
1
Ja, die Option maxsize ist jetzt verfügbar. Fall schließen :)
Frage Overflow
habe das in den docs entdeckt bevor ich dein update gelesen habe ... antworte jetzt erweitert. Danke.
mr.spuratic
1
> In der Statusdatei von logrotate (möglicherweise /var/lib/logrotate.status) werden nur Datumsangaben (keine Uhrzeitangaben) gespeichert. Diese Anweisung ist möglicherweise veraltet. Ich habe gerade meine Logrotate-Statusdatei überprüft und sie enthielt Zeitstempel mit einer zweiten Auflösung: "/var/log/kern.log" 2018-3-12-1: 8: 16
hyperair