Starten Sie die Protokolldateien bei der Protokollierung nicht erneut

10

Wir verwenden Upstart, um unsere Dienste auf unseren Ubuntu-Servern zu verwalten. Sie erstellen Protokolle, die in /var/log/upstart/SERVICE_NAME.log abgemeldet werden

Dann werden die Protokolldateien täglich mithilfe des Protokollrotationsskripts gedreht, das mit 12.04 LTS geliefert wird:

/var/log/upstart/*.log {
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

Das Problem ist, dass logrotate die Dateien zwar verschiebt, aber kein Signal für einen Neustart zum Schließen und erneuten Öffnen der Dateien zu sein scheint, sodass der Startvorgang in eine Lösch-PID geschrieben wird.

init          1       root    8w      REG              202,1        64       2431 /var/log/upstart/dbus.log.1 (deleted)
init          1       root   13w      REG              202,1        95       2507 /var/log/upstart/acpid.log.1 (deleted)
init          1       root   14w      REG              202,1       127      17377 /var/log/upstart/whoopsie.log.1 (deleted)
init          1       root   36w      REG              202,1       122       6747 /var/log/upstart/SERVICE_NAME.log.1 (deleted)
init          1       root   37w      REG              202,1        30       6762 

Natürlich könnte ich die Ausgabe meiner eigenen Dienste auf andere Protokolldateien umleiten, aber das Problem wäre immer noch für die Systemprozesse vorhanden. Außerdem möchte ich lieber nicht mehr Infrastruktur aufbauen als ich brauche.

Andrew Newdigate
quelle
Ich bin auch gerade darauf gestoßen. Es ist sehr seltsam, dass wir es vorher nicht bemerkt haben, was mich denken lässt, dass es eine neue Sache sein könnte.
Waller
1
Gibt es hierzu Neuigkeiten? Genau das gleiche Problem am 14.04. Es liegt an der nocreateRichtlinie, nicht sicher, warum jemand diese Richtlinie verwenden würde, insbesondere für Dienste, die möglicherweise eine Menge Ausgabe schreiben könnten
rynop
Auch dies erleben.
Ztyx
1
Ich habe diesen Fehler gefunden
Lety

Antworten:

2

Ich glaube, Sie haben 3 Möglichkeiten.

  1. Sie ändern die vorhandene Konfiguration, indem Sie "copytruncate" hinzufügen.

    /var/log/upstart/*.log { copytruncate daily missingok rotate 7 compress notifempty nocreate }

  2. Wenn Sie die vorhandene logrotate-Konfiguration aufgrund anderer Protokolldateien, die nicht betroffen sind und die vorhandene Konfiguration für sie funktioniert, nicht ändern können oder dürfen, verschieben Sie Ihre "SERVICE_NAME.log" -Dateien in einen neuen Ordner unter / var / log, wenn Sie möchten, erstellen Sie eine neue Konfiguration mit "copytruncate" und fügen Sie sie der cron.daily hinzu.

  3. a) Wenn Sie die Konfiguration des Host-Betriebssystems nicht ändern oder cron.daily des Host-Betriebssystems hinzufügen dürfen, besteht Ihre dritte Option darin, die Skripte oder Programme zu ändern, um zu überprüfen, ob die Datei vorhanden ist, bevor Sie in die Datei schreiben. b) Eine andere Möglichkeit ist ein Punkt von Punkt 2, bei dem Sie Ihre Protokolldateien an einen anderen Ort verschieben und in Ihrem Skript oder Programm den für die Protokolldatei dieses Programms spezifischen Befehl logrotate ausführen.

Punkt 3b oben ist kniffliger, aber eleganter und wird meistens verwendet, da das Programm autark und selbstverwaltet ist und nicht die Jobs des Betriebssystems benötigt, um es zu babysitten.

Um herauszufinden, wie Sie logrotate manuell ausführen und Ihrem Programm oder Skript hinzufügen können, geben Sie einfach Folgendes ein:

man logrotate

oder

logrotate --help

Wenn Sie Python für Ihre Programme verwenden, können Sie überprüfen, wie dieses Programm es verwendet, um seine Protokolldateien selbst zu verwalten. http://bazaar.launchpad.net/~ferncasado/keep.awake/trunk/files/head:/v4/

DanglingPointer
quelle
0

Es stellt sich heraus, dass dies ein bekanntes Problem ist und das Ticket während der Eingabe offen bleibt.

Das Richtige ist wahrscheinlich, einfach das Ganze zu entfernen /etc/logrotate.d/upstartund die Dateien der einzelnen Dienste einzeln zu drehen. Da das Verzeichnis ( /var/log/upstart/) nur das stdout / stderr der verschiedenen Dienste enthält - und kein Dienst, der als Daemon ausgeführt werden soll, sollte überhaupt auf diesen beiden Kanälen ausgegeben werden. Außer vielleicht gleich beim Start.

Auf den Systemen ich die Verwaltung werden drei Dienste von Emporkömmling aus: php5.6-fpm, php7.1-fpm, und acpid. Keines der drei Protokolle ist aktiv, aber manchmal wird die fpm neu gestartet, weil die Hauptprotokolldatei ( /var/log/php5.6-fpm.log) gedreht wird - und dies verursacht dieses Rauschen, da es beim Start etwas Irrtum ausgibt.

Wenn Sie trotzdem darauf bestehen, diese Dateien zu drehen, können Sie sich darauf verlassen, dass ihre Namen mit den Namen der Dienste übereinstimmen, und das folgende postrotateSkript verwenden:

    postrotate
            service=${1##*/}
            service=${service%.log*}
            service $service restart > /dev/null
    endscript

Damit dies funktioniert, sollten Sie das darin enthaltene Verb nicht verwenden. sharedscriptsMein Scriptlet basiert auf der Tatsache, dass der tatsächliche Pfad zur Datei als erstes Argument an sie übergeben wird ( $1).

(Die Umleitung in /dev/nullist nützlich, weil service-command ist laut -. Und Sie nicht wollen , ein solches Rauschen E-Mail an Sie von cron Hinweis, dass ich nicht umleiten stderrdort, nur stdout- wenn es ein Problem gibt , Sie Ich werde immer noch deine E-Mail darüber bekommen.)

Mikhail T.
quelle