Protokollierung mit elasticsearch-py

8

Ich möchte mein Skript python protokollieren, das elasticsearch-py verwendet. Insbesondere möchte ich drei Protokolle haben:

  1. Allgemeines Protokoll: log INFO und höher sowohl für stdout als auch für eine Datei.
  2. ES-Protokoll: Nur ES-bezogene Nachrichten nur für eine Datei.
  3. ES-Ablaufverfolgungsprotokoll : Erweiterte ES-Protokollierung (curl-Abfragen und ihre Ausgabe für Beispiel) nur in eine Datei.

Hier ist was ich bisher habe:

%Vor%

Mein Problem ist, dass INFO Nachrichten von es_logger auch auf dem Terminal angezeigt werden. In der Tat werden die Protokollmeldungen in den richtigen Dateien gespeichert!

Wenn ich den mit logger verknüpften Teil entferne, funktioniert die ES-Protokollierung einwandfrei, d. h. nur in den entsprechenden Dateien gespeichert. Aber dann habe ich den anderen Teil nicht .... Was mache ich falsch mit dem letzten Teil der Einstellungen?

Bearbeiten

Möglicher Hinweis: In den Quellen von elasticsearch-py befindet sich ein Logger namens logger . Könnte es sein, dass es mit meinem Konflikt ist? Ich habe versucht, den Namen von logger in main_logger in den Zeilen oben zu ändern, aber es hat nicht geholfen.

Möglicher Hinweis 2: Wenn ich logger = logging.getLogger('mainLog') durch logger = logging.getLogger() ersetze, ändert sich das Format der Ausgabe in der Konsole von es_logger und wird identisch mit dem im Snippet definierten.

    
Dror 22.08.2014, 13:10
quelle

1 Antwort

5

Ich denke, Sie werden von der etwas verwirrenden Logger-Hierarchie-Propagierung getroffen. Alles was in "elasticsearch.trace" eingeloggt ist, das den Loglevel von diesem Logger passiert, wird zuerst an den "elasticsearch" Logger und dann an den root ("") Logger weitergegeben. Beachten Sie, dass die Loglevels der Eltern ("elasticsearch" und root) nicht überprüft werden, sobald die Nachricht den Loglevel des "elasticsearch.trace" -Loggers übergibt, aber alle Nachrichten an die Handler gesendet werden. (Die Handler selbst haben Loglevel, die sich bewerben.)

Betrachten Sie das folgende Beispiel, das das Problem veranschaulicht, und eine mögliche Lösung:

%Vor%

Ausgabe:

%Vor%

Sie sehen, dass "msg1" sowohl vom "foo" -Logger als auch vom übergeordneten Rootlogger (als "DEBUG: foo: msg1") protokolliert wird. Wenn die Weitergabe ll.propagate = False vor "msg2" deaktiviert ist, protokolliert der Stammlogger sie nicht mehr. Wenn Sie nun die erste Zeile ( logging.info("DUMMY...") ) auskommentieren, würde sich das Verhalten ändern, so dass die Root-Logger-Zeile nicht angezeigt würde. Dies liegt daran, dass die Funktionen logging des Moduls oberste Ebene info() , debug() Konfigurieren Sie den Root-Logger mit einem Handler, wenn noch kein Handler definiert wurde.Deshalb sehen Sie in Ihrem Beispiel ein anderes Verhalten, wenn Sie den Root-Handler ändern, indem Sie logger = logging.getLogger() machen.

Ich kann in Ihrem Code nicht sehen, dass Sie irgendetwas mit dem Root-Logger tun würden, aber wie Sie sehen, würde ein stray logging.info() oder ähnliches in Ihrem Code oder Bibliothekscode dazu führen, dass ein Handler hinzugefügt wird.

Also, um Ihre Frage zu beantworten, würde ich logger.propagate = False auf die Logger setzen, wo es für Sie Sinn ergibt und wo Sie propagieren wollen, überprüfen Sie, ob der Loglevel der Handler selbst so ist, wie Sie wollen.

Hier ist ein Versuch:

%Vor%     
Anton 25.08.2014, 13:26
quelle

Tags und Links