Ich habe ein Linux-Programm, das Informationen in stdout und stderr schreiben kann.
Ich habe ein Shell-Skript, das diese Ausgabe in eine Datei umleitet /var/log
. (Via >>
und 2>&1
.)
Gibt es eine Möglichkeit, diese Protokolldatei rotieren zu lassen? (maximale Größe, dann zu einer anderen Datei wechseln, nur eine begrenzte Anzahl von Dateien aufbewahren)
Ich habe ein paar Antworten gesehen, die über das logrotate
Programm sprechen , was sich gut anhört, aber sie scheinen sich auch auf Programme zu konzentrieren, die intern Protokolldateien generieren und HUP-Signale verarbeiten. Gibt es eine Möglichkeit, dies mit einem grundlegenden Ausgabeumleitungsskript zu erreichen?
logrotate
wenn es eine bessere Option, die wie ein bequemer Ausgangspunkt für die Diskussion nur klang.Antworten:
Alternativ können Sie die Ausgabe über Tools weiterleiten, die in erster Linie dazu dienen, Protokolldateigruppen mit Größenbeschränkung und automatischer Drehung zu verwalten, z.
multilog
von daemontoolsmultilog
von daemontools-encores6-log
von S6svlogd
von runittinylog
von perpcyclog
von noshZu den Tools zum anschließenden Verarbeiten von
multilog
Protokolldateigruppen im Format gehören unter anderem:multilog-watch
logrange
multilog-stamptail
follow-log-directories
von noshexport-to-rsyslog
von noshWeitere Lektüre
logrotate
odernewsyslog
in diesem Jahrhundert. . Häufig gestellte Fragen.quelle
multilog
sieht aus wie genau das, was ich brauchte.multilog
nirgendwo symbolische Verknüpfungen entstehen oder verlangt werden. Es ist ihnen gegenüber völlig neutral.Das
rotatelogs
mit Apache gelieferte Tool (imbin
Verzeichnis) (siehe Dokumentation ) nimmt Eingaben von stdin entgegen und dreht das Protokoll nach einer bestimmten Zeitquelle
Wenn Sie es zu einem der Standard-Protokolldatenströme (Syslog, Daemon, Cron, Benutzer, Sicherheit, E-Mail usw.) weiterleiten lassen können
logger
, können Sie stattdessen den Befehl verwenden und eine Pipe zu diesem Stream erstellen .Andernfalls ist es möglicherweise besser, den protokollierten Inhalt an ein benutzerdefiniertes Programm oder Skript weiterzuleiten, um ihn zu verarbeiten, oder die
logrotate
Konfiguration einzurichten .EDIT: Die Antwort von JdeBP scheint das zu haben, wonach Sie suchen.
quelle
Ich hatte ein ähnliches Problem und musste anfänglich logrotate verwerfen, aber es stellte sich heraus, dass logrotate dies tatsächlich gut kann. Die Schlüsselanweisung ist " copytruncate ". Aus irgendeinem Grund tauchte dieser Begriff bei keinem der von mir durchgeführten Google-Vorgänge auf. Daher füge ich diese Antwort hinzu, um zu verdeutlichen, wie er in diesem Fall verwendet wird.
Der Trick ist, dass dies nur funktioniert, wenn die Umleitung mit " >> " (Anhängen) anstelle von " > " (Erstellen) erfolgt.
Konfigurationsdatei (truncate.cfg):
Testprogramm (gibt Datei nie auf). Sie können beobachten, wie der Datenträger gefüllt wird, und obwohl das Löschen der Protokolldatei funktioniert, wird tatsächlich kein Speicherplatz auf dem Datenträger freigegeben:
Laufendes Protokoll drehen:
quelle
echo /dev/urandom >> /tmp/temp.log
werden 13 deterministische Zeichen geschrieben/tmp/temp.log
und sofort beendet. Meinten Siecat /dev/urandom
?Ja! Schauen Sie sich die von logrotate angebotene Anweisung "copytruncate" an. Wenn Sie dies angeben, wird logrotate angewiesen, genau mit dieser Situation umzugehen: ein einfaches Programm, dessen Protokolldatei unbegrenzt geöffnet bleibt.
Eine Einschränkung kann in Ihrer Situation ein Problem sein oder auch nicht:
Anekdotisch habe ich einige "echte" Protokollquellen gesehen, die Benutzer dazu ermutigen, diese Direktive anzuwenden. Diese Option wird hier diskutiert .
quelle
Benutze split, es ist Teil von coreutils. Es kann stdin nehmen und es in Blöcke aufteilen (basierend auf der Blockgröße oder der Anzahl der Zeilen usw.).
Beispiel:
Beachten Sie, dass der Bindestrich (-) "split" anweist, stdin anstelle von file zu verwenden.
quelle
split
sich Daten in einem möglicherweise großen Puffer befinden. Angesichts der Tatsache, dass es mehrere Tools gibt, die dieses Problem ordnungsgemäß lösen, kann diese Art der Eigenentwicklung meines Erachtens überhaupt nicht empfohlen werden.Ich mag
multilog
für meinen Anwendungsfall, aber mein Anwendungsfall ist so trivial / einfach, dass er in den Dokumenten / Beispielen, die ich gefunden habe, nicht sehr einfach dargestellt wird. Hier ist ein einfaches Multilog-Rotationsbeispiel:Einige Notizen:
"Note that running processor may block any program feeding input to multilog."
wobei "Prozessor" der'!tai64nlocal'
Teil des Befehls ist* Für viele Anwendungen ist dies eine schlechte Wahl für den Langzeitgebrauch. Mit ihnen können Sie das Befüllen und Drehen der Protokolle schneller beobachten als mit großen Protokollen.
Schließlich vergessen Sie nicht, bei Bedarf zu nohup! Mit nohup brauchen Sie nicht das
2>&1
(s = 10e6 und n = 30 hier):Mit diesem Befehl können Sie loslegen.
quelle
Ich wollte nur den obigen Kommentar von Sam Hendley ergänzen:
Der Trick ist, dass dies nur funktioniert, wenn die Umleitung mit
>>
(Anhängen) anstelle von>
(Erstellen) erfolgt.Ich bin auf dasselbe Problem gestoßen, bei dem die Originaldatei immer größer wird, wenn Sie Logrotate verwenden
>
(create), aber wenn Sie>>
Logrotate verwenden (append), funktioniert copytruncate wunderbar und wie erwartet. Die ursprüngliche Datei wird auf null Byte zurückgesetzt und das Programm schreibt weiter.Leiten Sie STDOUT und STDERR in eine rotierende Protokolldatei um:
some-program.sh >> /tmp/output.txt 2>&1 &
Erstellen Sie eine logrotate-Konfigurationsdatei unter dem
/etc/logrotate.d
Namen "whatever", in meinem Fall "output_roll".Beispielkonfiguration für meinen Fall:
Richten Sie Ihren Cron-Job in der
/etc/crontab
Datei einDadurch wird die Datei jede Minute überprüft. Sie können sich an Ihre Bedürfnisse anpassen.
Fang an:
Das ist es
Hinweis: Ich hatte auch ein Problem damit, dass SELinux auf eingestellt war,
SELINUX=enforcing
also habe ich es auf eingestelltSELINUX=disabled
.quelle
Ich habe an diesem Wochenende einen Logrotee geschrieben . Ich würde es wahrscheinlich nicht tun, wenn ich die großartige Antwort von @ JdeBP gelesen und gelesen hätte
multilog
.Ich habe mich darauf konzentriert, dass es leichtgewichtig ist und in der Lage ist, seine Ausgabestücke wie folgt zu bzip2:
Es gibt jedoch noch viel zu tun und zu testen.
quelle