Ich kann mich nicht mit Pythons logging
Modul beschäftigen. Meine Anforderungen sind sehr einfach: Ich möchte einfach alles in Syslog protokollieren. Nachdem ich die Dokumentation gelesen hatte, kam ich auf dieses einfache Testskript:
import logging
import logging.handlers
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)
handler = logging.handlers.SysLogHandler()
my_logger.addHandler(handler)
my_logger.debug('this is debug')
my_logger.critical('this is critical')
Dieses Skript erzeugt jedoch keine Protokolldatensätze in Syslog. Was ist los mit dir?
Antworten:
Ändern Sie die Zeile in diese:
Das funktioniert bei mir
quelle
'/var/run/syslog'
das Richtige unter OS X ist.logging.Formatter(fmt='myscriptname[%(process)d]: %(levelname)s: %(message)s', ...)
, einem rsyslog-Zustand wie$programname == 'myscriptname'
funktioniert getestet .Sie sollten immer den lokalen Host für die Protokollierung verwenden, egal ob in / dev / log oder localhost über den TCP-Stack. Dadurch kann der vollständig RFC-kompatible und funktionsfähige Systemprotokollierungsdämon Syslog verarbeiten. Dadurch muss der Remote-Daemon nicht mehr funktionsfähig sein, und die erweiterten Funktionen von Syslog-Daemons wie z. B. rsyslog und syslog-ng werden bereitgestellt. Die gleiche Philosophie gilt für SMTP. Geben Sie es einfach an die lokale SMTP-Software weiter. Verwenden Sie in diesem Fall den Programmiermodus, nicht den Dämon, aber es ist dieselbe Idee. Lassen Sie die leistungsfähigere Software damit umgehen. Wiederholen, Anstehen, lokales Spoolen, Verwenden von TCP anstelle von UDP für Syslog usw. werden möglich. Sie können diese Daemons auch separat von Ihrem Code [neu] konfigurieren, wie es sein sollte.
Speichern Sie Ihre Codierung für Ihre Anwendung und lassen Sie andere Software ihre Arbeit gemeinsam erledigen.
quelle
Ich habe das Syslog-Modul gefunden , um das von Ihnen beschriebene grundlegende Protokollierungsverhalten ganz einfach zu ermitteln:
Es gibt noch andere Dinge, die Sie tun könnten, aber schon in den ersten beiden Zeilen erhalten Sie das, wonach Sie gefragt haben, so wie ich es verstehe.
quelle
Wenn ich die Dinge von hier und anderen Orten aus zusammensetze, habe ich mir das ausgedacht, das für unbuntu 12.04 und centOS6 funktioniert
Erstellen Sie eine Datei
/etc/rsyslog.d/
, die auf .conf endet, und fügen Sie den folgenden Text hinzuNeustart
rsyslog
, Neuladen schien für die neuen Protokolldateien NICHT zu funktionieren. Vielleicht werden nur vorhandene conf-Dateien neu geladen?Dann können Sie dieses Testprogramm verwenden, um sicherzustellen, dass es tatsächlich funktioniert.
quelle
sudo service rsyslog restart
Ich füge einen kleinen zusätzlichen Kommentar hinzu, nur für den Fall, dass es jemandem hilft, weil ich diesen Austausch nützlich fand, aber diese kleinen zusätzlichen Informationen brauchte, um alles zum Laufen zu bringen.
Um sich mit SysLogHandler bei einer bestimmten Einrichtung anzumelden, müssen Sie den Wert der Einrichtung angeben. Sagen Sie zum Beispiel, dass Sie definiert haben:
local3.* /var/log/mylog
In Syslog möchten Sie Folgendes verwenden:
handler = logging.handlers.SysLogHandler(address = ('localhost',514), facility=19)
Außerdem muss Syslog UDP abhören, um localhost anstelle von / dev / log verwenden zu können.
quelle
Ist Ihre syslog.conf für die Behandlung von Facility = User eingerichtet?
Sie können die vom Python-Logger verwendete Einrichtung mit dem Einrichtungsargument wie folgt festlegen:
quelle
LOG_DAEMON
Wert Sie als Wert für denfacility
Parameter angeben .SysLogHandler.LOG_DAEMON
.Das obige Skript wird mit unserem benutzerdefinierten "LOG_IDENTIFIER" in der LOCAL0-Einrichtung protokolliert. Sie können LOCAL [0-7] für lokale Zwecke verwenden.
quelle
Von https://github.com/luismartingil/per.scripts/tree/master/python_syslog
quelle
Hier ist die für 3.2 und höher empfohlene yaml dictConfig-Methode.
Im Protokoll
cfg.yml
:Laden Sie die Konfiguration mit:
Konfigurierte sowohl Syslog als auch eine direkte Datei. Beachten Sie, dass das
/dev/log
Betriebssystem spezifisch ist.quelle
Ich repariere es auf meinem Notizbuch. Der rsyslog-Dienst hat den Socket-Dienst nicht abgehört.
Ich habe diese Zeile unten in der
/etc/rsyslog.conf
Datei konfiguriert und das Problem gelöst:$SystemLogSocketName /dev/log
quelle
Sie können auch einen Dateihandler oder einen rotierenden Dateihandler hinzufügen, um Ihre Protokolle an eine lokale Datei zu senden: http://docs.python.org/2/library/logging.handlers.html
quelle