Frage Warum werden nur einige meiner Protokolle rotiert?


Ich benutze Ubuntu 14.04. Ich habe folgendes in meiner /etc/logrotate.conf Datei ...

/home/rails/myproject/log {
        daily
        rotate 3
        compress
        delaycompress
        missingok
        notifempty
        create 644 rails rails
}

/var/log/postgresql {
        daily
        rotate 3
        compress
        delaycompress
        missingok
        notifempty
        create 644 root root
}

Jede Nacht würde ich mir meine Schienen ansehen und es wäre immer größer - d. H. Es schien nicht so, als würden die Stämme rotiert werden ...

myuser@myproject:~$ ls -al /home/rails/myproject/log
total 4574368
drwxr-xr-x  2 rails rails       4096 May 30 12:04 .
drwxr-xr-x 15 rails rails       4096 May 30 12:03 ..
-rw-rw-r--  1 rails rails      14960 Jun  1 22:39 development.log
-rw-rw-r--  1 rails rails          0 Oct 22  2016 .keep
-rw-r--r--  1 rails rails 4523480004 Jun 22 10:19 production.log
-rw-rw-r--  1 rails rails  156358087 Jun 22 10:19 sidekiq.log
-rw-rw-r--  1 rails rails      54246 Apr 10 14:34 test.log

Wenn ich den Befehl manuell ausführe, sehe ich, dass einige der Logs gedreht werden ...

myuser@myproject:~$ sudo logrotate /etc/logrotate.conf
myuser@myproject:~$ ls -al /home/rails/myproject/log
total 4570288
drwxr-xr-x  2 rails rails       4096 Jun 22 10:22 .
drwxr-xr-x 15 rails rails       4096 May 30 12:03 ..
-rw-rw-r--  1 rails rails          0 Jun 22 10:22 development.log
-rw-rw-r--  1 rails rails      14960 Jun  1 22:39 development.log.1
-rw-rw-r--  1 rails rails          0 Oct 22  2016 .keep
-rw-r--r--  1 rails rails          0 Jun 22 10:22 production.log
-rw-r--r--  1 rails rails 4523505906 Jun 22 10:23 production.log.1
-rw-rw-r--  1 rails rails  156369048 Jun 22 10:23 sidekiq.log
-rw-rw-r--  1 rails rails      54246 Apr 10 14:34 test.log

Wie finde ich heraus, warum meine Schienen nicht nachts rotiert werden? Beachten Sie, dass andere Protokolle im System zu sein scheinen. Oben habe ich meine Postgres-Konfiguration eingefügt, und wenn ich mir die Logs dort anschaue, scheinen sie normal zu rotieren ...

myuser@myproject:~$ ls -al /var/log/postgresql
total 1832
drwxrwxr-t  2 root     postgres    4096 May  2 20:42 .
drwxr-xr-x 13 root     root        4096 Jun 22 10:22 ..
-rw-r-----  1 postgres adm      1861361 Jun 22 10:14 postgresql-9.6-main.log

Danke, - Dave

Bearbeiten: Die Konfiguration in eine separate Datei zu stellen schien nichts zu tun. Unten ist meine Konfiguration und auch die Logs, die anscheinend nicht gedreht wurden ...

myuser@myapp:~$ sudo cat /etc/logrotate.d/myapp
[sudo] password for myuser:
/home/rails/myapp/log/*.log {
   daily
   missingok
   compress
   notifempty
   rotate 12
   create
   delaycompress
   missingok
   su rails rails
}

Hier sind die Protokolle. Es scheint nichts passiert zu sein ...

myuser@myapp:~$ ls -al /home/rails/myapp/log
total 4635956
drwxr-xr-x  2 rails rails       4096 Jun 22 10:22 .
drwxr-xr-x 15 rails rails       4096 May 30 12:03 ..
-rw-rw-r--  1 rails rails          0 Jun 22 10:22 development.log
-rw-rw-r--  1 rails rails      14960 Jun  1 22:39 development.log.1
-rw-rw-r--  1 rails rails          0 Oct 22  2016 .keep
-rw-r--r--  1 rails rails          0 Jun 22 10:22 production.log
-rw-r--r--  1 rails rails 4546785231 Jun 24 12:12 production.log.1
-rw-rw-r--  1 rails rails  200336693 Jun 24 12:51 sidekiq.log
-rw-rw-r--  1 rails rails      54246 Apr 10 14:34 test.log

3
2018-06-22 14:46


Ursprung


Die postgresql-Protokolldateien scheinen nicht von der Ausgabe gedreht zu sein, die Sie in die Frage aufgenommen haben. Bist du sicher, dass sie richtig gedreht werden? Es wird auch empfohlen, logrotate Konfigurationsdateien zu verwenden /etc/logrotate.d anstatt zu verwenden /etc/logrotate.confHat die logrotate.conf noch ihren ursprünglichen Inhalt? - Arronical
Warum sagen Sie, dass die Postgres-Logs nicht rotiert zu sein scheinen? Wenn sie sich nicht drehen würden, hätte ich keine ständig wachsende Datei? - Dave
Das sieht wie das aus, was du hast . und .. Dateien beziehen sich auf das Verzeichnis /var/log/postgresqlund das übergeordnete Verzeichnis /var/log, Sie sehen diese, weil Sie die verwenden -a einschalten ls. Wenn sie rotieren würden, hätten Sie Dateien postgrsql-9.6-main.log, postgrsql-9.6-main.log.1 und postgrsql-9.6-main.log.2.gz. - Arronical
Ok, also ist es Ihr Rat, die Konfiguration aus /etc/logrotate.conf zu entfernen und stattdessen Dateien innerhalb von /etc/logrotate.d/ zu erstellen? Ich denke nicht, dass es wichtig war, wo die Konfiguration war. - Dave
Es ist aus der Sicht von Logrotate nicht wichtig, aber es ist eine Menge Zeug drin /etc/logrotate.confdas muss da sein, wie rotieren /var/log/wtmp und /var/log/btmp. Ich habe gerade bemerkt, dass der Abschnitt beschriftet ist #system-specific logs... Nehmen wir also an, dass es kein Problem ist, Logrotate-Anweisungen anzuhängen. Ich finde es einfacher, bestimmte Dateien zu haben, um die Verwaltung zu erleichtern. Die Antwort unten sollte das Problem lösen, das ich denke, dass Sie haben. - Arronical


Antworten:


Logrotate muss Dateien verschieben (umbenennen) und komprimieren. Sie haben es in diesem Fall so konfiguriert, dass Sie die Rails-Protokolldateien umbenennen und komprimieren und dann neue mit den ursprünglichen Namen erstellen können.

Dateinamen sind eine Möglichkeit, eine Datei zu finden, aber die eigentliche Datei ist nur ein Teil des Speicherplatzes auf der Festplatte. Eine Datei kann mehrere Namen haben (Hard Links) oder keine Namen (Sie können rm eine Datei, die geöffnet ist, aber immer noch Speicherplatz auf der Festplatte belegt, solange die Datei in einem Prozess geöffnet ist).

Das Problem, das Sie hier zu haben scheinen, ist, dass die Rails-App die Datei bereits geöffnet hat, wenn sie umbenannt wird. Der Rails-Logger bemerkt die Namensänderung nicht, weil er den Namen einmal verwendet hat, um die Datei zu öffnen, und dann komplett aufgehört hat, sich um seinen Namen zu kümmern. Der Logger hat nur einen Griff auf die geöffnete Datei.

Sie müssen es überreden, die Log-Dateien zu schließen und wieder zu öffnen, indem Sie ihre Namen erneut verwenden, was bedeutet, dass es beginnt, auf die neuen leeren zu schreiben, die nun den Namen haben, den die alten hatten.

Wenn Sie hineinschauen /etc/logrotate.d Je nachdem, was Sie installiert haben, werden Sie viele Beispiele sehen.

Zum Beispiel hat rsyslog:

postrotate
    invoke-rc.d rsyslog rotate > /dev/null
endscript

Stunnel hat:

postrotate
    /etc/init.d/stunnel4 reopen-logs > /dev/null
endscript

Dies sind Skripte, die dem relevanten Prozess mitteilen, dass die Datei erneut geöffnet werden muss. Der spezifische Mechanismus hängt von dem Programm ab, was jedoch dazu tendiert, sendet a HUP (oder manchmal USR1) (sehen man 7 signal), die lang andauernde Prozesse als Anweisung zum Schließen und erneuten Öffnen von Logfiles nehmen.

Im Fall von Rails variiert die Art und Weise, dies zu tun, abhängig davon, welchen Logger Sie verwenden. Ich habe gerade einen Ratschlag gesehen, den Sie vorschlagen sollten copytruncate Das ist im Grunde genommen eine "Cheat-Option" in logrotate, die besagt, dass der Inhalt manuell kopiert und die Datei geleert werden soll, anstatt sie zu verschieben und eine neue zu erstellen. (sehen man logrotate.conf). Dies wird anstelle von verwendet create so:

/home/rails/myapp/log/*.log {
    daily
    missingok
    compress
    notifempty
    rotate 12
    copytruncate
    delaycompress
    missingok
    su rails rails
}

Dies ist keine großartige Lösung, da es buchstäblich die gesamte Datei kopiert (um eine Momentaufnahme davon zu erstellen), bevor der Inhalt gelöscht wird, was ziemlich ineffizient ist.

Wenn Sie jedoch verwenden Einhorn Zum Ausführen Ihrer App (die Anfragen über eine Reihe von identischen Rails-Worker-Prozessen multiplext) unterstützt sie das USR1-Signal als normal (tötet und ersetzt alle Worker, was bewirkt, dass sie die Dateien wieder öffnen) und Sie können es einfach in a senden postrotate verwenden pkilloder ähnlich, vielleicht so:

/home/rails/myapp/log/*.log {
    daily
    missingok
    compress
    notifempty
    rotate 12
    create
    delaycompress
    missingok
    su rails rails
    postrotate
        pkill -USR1 -u rails unicorn
    endscript
}

pkill ist ein Werkzeug um laufende Prozesse zu suchen und ihnen Signale zu senden, damit diese alles mit dem Namen finden unicorn läuft als der rails Benutzer und senden Sie es an die USR1 signalisieren, dass es die Protokolldateien erneut öffnen soll. (Die Beispiele, die ich von Ubuntu-Paketen gebe, /etc/logrotate.d Dateien machen das gleiche, aber diese Dienste haben die Suche in ihren Funktionen versteckt /etc/init.d Skripte.)

Ich bin mir sicher, dass es eine Möglichkeit geben wird, ein Vernünftiges zu konfigurieren postrotate Für was auch immer Rails-Setup Sie haben (im schlechtesten und einfachsten Fall, starten Sie es einfach neu), aber hoffentlich erklärt das die Ubuntu-Seite der Dinge sowieso ...


0
2017-07-02 16:43



Ich bin immer noch ein Neuling bei all dem und ich verstehe nicht, was Sie erklären. Sie sagen, das Problem ist auf der Rails-Seite und nicht mit meinem Logrotate? Nur für Tritte, welche Konfiguration würdest du für diese betrügerische Option erwähnen? Solange es den Job erledigt, bin ich glücklich zu betrügen. - Dave
Ich habe versucht, ein wenig zu verdeutlichen und ein Beispiel dafür gegeben copytruncate. Es ist nur eine andere (weniger effiziente) Methode, die ersetzt create, entworfen für Prozesse, die Dateien nicht richtig öffnen können. - Tom Spurling
Danke für diese Klarstellungen. Gibt es irgendeine Möglichkeit, diese zu testen, bevor ich darauf warte, ob sie heute Nacht hingerichtet werden? Ich möchte dich nicht an der Beute hängen lassen, wenn das tatsächlich mein Problem löst. - Dave
Ich bin ein bisschen spät, aber ja, Sie können eine frühe Rotation für eine bestimmte Konfigurationsdatei auslösen: sudo logrotate -fv /etc/logrotate.d/rails beispielsweise. -f bedeutet "ignoriere die Tatsache, dass die Datei nicht alt genug ist und mache es einfach". -v bedeutet "erkläre, was du tust". (Es gibt alternativ a -d Das bedeutet "sag was du tun würdest, ohne es zu tun", obwohl das in diesem Fall nicht wirklich hilfreich ist, da du eher daran interessiert bist, ob sich die Rails-App nach der Rotation verhält. Viel Glück! - Tom Spurling
Das erinnert mich daran, dass dies wahrscheinlich der Hauptgrund ist, separate Konfigurationsdateien für jede Anwendung zu verwenden (abgesehen davon, dass sie auf Pakete aufgeteilt werden müssen). Wenn das Zeug, das du testen wolltest, drin war /etc/logrotate.conf, würde dein Testlauf am Ende alles tun, weil das sagt include /etc/logrotate.d. - Tom Spurling


Es sieht so aus, als ob das Problem darin liegt, dass Sie anstelle der eigentlichen Dateinamen ein Verzeichnis für die Dateirotation angeben. Die Konfigurationsdateien für logrotate akzeptieren Platzhalter für globbing (Mustervergleich).

Um alle Dateien mit a zu drehen .log Erweiterung in Ihrem /home/rails/myproject/log In diesem Verzeichnis können Sie die folgende Zeile anstelle der ersten Zeile Ihrer Konfiguration verwenden:

/home/rails/myproject/log/*.log {

und ähnlich in der Postgres-Verzeichniskonfiguration

/var/log/postgresql/*.log {

Es ist möglich, das zu verwenden * Wildcard ohne die .log Erweiterung, um alle Dateien zu rotieren (außer versteckte Dateien beginnend mit a .) in Ihrem postgresql-Verzeichnis, aber ich bevorzuge die zusätzliche Kontrolle der Angabe .log nur Dateien:

/var/log/postgresql/* {

Als Nebenbemerkung sei darauf hingewiesen, wie Sie mit logrotate neue Versionen der Protokolldatei erstellen. Wenn Sie das neue postgresql-Protokoll mit 644 oktalen Berechtigungen erstellen, die dem Benutzer root gehören, kann der postgres-Benutzer nicht in die Datei schreiben neue Protokolldatei


1
2018-06-22 16:04



Ich mache mir mehr Sorgen um die Rails-Logs, da sie weiter zu wachsen scheinen. Lassen Sie mich nun die Einstellungen anwenden, die Sie hier haben, und sehen Sie, wie sich die Dinge heute Abend erschüttern. - Dave - Dave
Möglicherweise müssen Sie warten, bis ein zweiter Tag verstrichen ist, an dem sich die Protokolle drehen, wenn Sie gestern ein logrotate manuell ausgeführt haben. Ich glaube mich daran zu erinnern, dass es peinlich ist, dass ganze 24 Stunden vergangen sind. Daumen drücken! - Arronical
Oh, schieß, ich habe deinen Kommentar nicht gesehen. Es schien nicht, dass sich die Dinge letzte Nacht gedreht hatten, also warte ich auf heute Abend und poste morgen eine Ausgabe. Vielen Dank - Dave
Hallo, Ok, ich habe meine Frage bearbeitet, um zu beschreiben, wie die Logs nach dem Nachtlauf aussahen. Sie sind gleich. Es sieht nicht so aus, als ob etwas gedreht wurde. Gibt es Logs von waht / etc / logrotate? Ich bin neugierig, warum es scheinbar nichts rotiert. - Dave


Überprüfen Sie den Status in /var/lib/logrotate/status wenn irgendwas angezeigt wird     Probleme

Überprüfen Sie die Berechtigungen und den Besitz der Dateien in     /etc/logrotate.d root-Besitzer und Zugriffsmodus 644. Code-Snippet     für Logrotate:

/home/rails/myapp/log/*.log {
   rotate 12
   daily
   missingok
   compress
   notifempty
   create 640 rails rails
   delaycompress
   missingok
}

Überprüfen Sie die logrotate Ausgabe durch manuelle Ausführung mit --verbose  Wenn Sie eine Logrotation für mehr als eine bestimmte Größe benötigen, können Sie experimentieren maxsize und size Optionen in der logrotate Konfigurationsdatei


0
2017-07-03 11:34



Meine Berechtigungen und Besitzrechte für die Konfigurationsdatei sind "-rw-r - r - 1 root root 161 Jun 22 12:04 rails_config", was mit allen anderen Konfigurationen übereinstimmt. Ich nehme an, dass dies die Berechtigungen waren, auf die Sie sich bezogen haben? - Dave
Ja, überprüfen Sie jetzt den Log-Rotate-Status der letzten Nacht. Es wird einige Hinweise geben, die sich auf die Rotation beziehen oder die bestimmte Datei aus irgendeinem Grund überspringen - v_sukt