Rsyslog beendet das Senden von Daten an den Remote-Server nach der Protokollrotation

9

In meiner Konfiguration habe ich rsyslog, das für die folgenden Änderungen der /home/user/my_app/shared/log/unicorn.stderr.logVerwendung verantwortlich ist imfile. Der Inhalt wird mithilfe von TCP an einen anderen Remote-Protokollierungsserver gesendet.

Wenn sich die Protokolldatei dreht, sendet rsyslog keine Daten mehr an den Remote-Server.

Ich habe versucht, rsyslog neu zu laden, ein HUP-Signal zu senden und es insgesamt neu zu starten, aber nichts hat funktioniert.

Die einzigen Möglichkeiten, die ich finden konnte, die tatsächlich funktionierten, waren schmutzig:

  • Beenden Sie den Dienst, löschen Sie die rsyslog-Statistikdateien und starten Sie rsyslog erneut. All das in einem Postrotate-Hook in meiner Logrotate-Datei.
  • kill -9 rsyslog und neu starten.

Gibt es eine richtige Möglichkeit für mich, dies zu tun, ohne die Interna von rsyslog zu berühren?

Rsyslog-Datei

$ ModLoad immark
$ ModLoad imudp
$ ModLoad imtcp
$ ModLoad imuxsock
$ ModLoad imklog
$ ModLoad imfile

$ template WithoutTimeFormat, "[Umgebung] [% syslogtag%] -% msg%"

$ WorkDirectory / var / spool / rsyslog

$ InputFileName /home/user/my_app/shared/log/unicorn.stderr.log
$ InputFileTag unicorn-stderr
$ InputFileStateFile stat-unicorn-stderr
$ InputFileSeverity-Informationen
$ InputFileFacility local8
$ InputFilePollInterval 1
$ InputFilePersistStateInterval 1
$ InputRunFileMonitor

# An Remote-Server weiterleiten
Wenn $ syslogtag 'apache-' enthält, dann @@ my_server: 5000; WithoutTimeFormat
: syslogtag, enthält "apache-" ~

*. * @@ my_server: 5000; SyslFormat

Logrotate-Datei

/home/user/my_app/shared/log/*.log {
  Täglich
  Missingok
  Datumsangabe
  30 drehen
  komprimieren
  notifempty
  Erweiterung gz
  copytruncate
  Erstellen Sie 640 Benutzer Benutzer
  Sharedscripts
  nachdrehen
    (Stoppen Sie rsyslog && rm / var / spool / rsyslog / stat- * && starten Sie rsyslog 2> & 1) || wahr
  Endschrift
}}

Zu Ihrer Information, die Datei ist für den Benutzer von rsyslog lesbar, mein Server ist erreichbar und andere Protokolldateien, die sich nicht im selben Zyklus drehen, werden weiterhin ordnungsgemäß verfolgt.

Ich verwende Ubuntu 12.04.

Vincent B.
quelle

Antworten:

8

Das Problem kam tatsächlich von logrotate.

Grundsätzlich muss ich bei meiner Konfiguration mit Einhorn die copytruncateDirektive nicht verwenden. (was hier Probleme verursacht)

USR1 - Öffnen Sie alle Protokolle des Arbeitsprozesses erneut. Unter Unicorn :: Util.reopen_logs finden Sie Informationen zu einem Protokoll. Protokolldateien werden erst wieder geöffnet, wenn die aktuelle Anforderung verarbeitet wurde. Daher werden mehrere Protokollzeilen für eine Anforderung (wie von Rails ausgeführt) nicht auf mehrere Protokolle aufgeteilt.

Dies funktionierte nach dem Update auf diese Konfiguration ordnungsgemäß:

/home/user/my_app/shared/log/*.log {
  daily
  missingok
  dateext
  rotate 30
  compress
  notifempty
  extension gz
  create 640 user user
  sharedscripts

  post-rotate
    # Telling Unicorn to reload files
    test -s /home/user/my_app/shared/pids/unicorn.pid && kill -USR1 "$(cat /home/user/my_app/shared/pids/unicorn.pid)"

    # Reloading rsyslog telling it that files have been rotated
    reload rsyslog 2>&1 || true
  endscript
}
Vincent B.
quelle
Wenn es sich um direkte Kopien Ihrer Datei handelt, bestand Ihr Problem wahrscheinlich darin, dass Sie stattdessen post-rotate(was keine Sache ist) verwendet haben postrotate, da das ursprüngliche Logrotate-Skript, das Sie hatten, mit rsyslog gut hätte funktionieren sollen (wenn das Postrotate-Skript ausgeführt worden wäre ) ...?
mltsy
2
Ich erinnere mich nicht wann, aber ich habe mich geändert post-rotatefür lastaction. Ihr Kommentar ist immer noch sehr vernünftig und hat möglicherweise mein Problem zu der Zeit gelöst :). Für die Aufzeichnung werde ich es jedoch copytruncatein Zukunft sowieso vermeiden, da es langsam ist und mit Dateihandles spielt.
Vincent B.
2

Ihre Protokolldatei enthält einen Eintrag für /home/user/shared/log/*.log, der nicht mit Ihrer Protokolldatei übereinstimmt /home/user/my_app/shared/log/unicorn.stderr.log. Sie müssen einen Logrotate-Eintrag für dieses Verzeichnis hinzufügen und sicherstellen, dass er enthält. So copytruncatewie es ist, benennt rsyslog die aktuelle Datei um und erstellt eine neue. Imfile folgt weiterhin dem Dateihandle der jetzt umbenannten Datei.

Jenny D.
quelle
Entschuldigung, der Dateiname ist nur ein Tippfehler. Copytruncate kann jedoch ein guter Punkt sein. Lass mich nur einen Blick darauf werfen :).
Vincent B.