Das Python-Protokollierungsmodul gibt falsche Zeitzoneninformationen aus

8

Ich stoße auf ein Problem mit dem Protokollierungsmodul von Python 2.7. Mein System ist Ubuntu 14.04 64bit, und ich lebe in Italien (derzeit UTC + 1, keine Sommerzeit); Das System ist ordnungsgemäß als solches konfiguriert.

Ich möchte Protokollzeilen in der aktuellen Zeitzone ausgeben, die korrekte Zeitzonen-Offset-Informationen enthalten.

Betrachten Sie das folgende Snippet:

%Vor%

Was zu diesem Ergebnis führt:

%Vor%

Also, das System kennt die richtige Zeit UND Offset, während Python scheint die Zeit falsch zu verstehen.

In Datetime-Dokumenten heißt es, dass für% z in strftime das Ergebnis "UTC-Offset in der Form + HHMM oder -HHMM (leere Zeichenfolge, wenn das Objekt naiv ist)" ist.

Ich hätte also eines der folgenden Ergebnisse erwartet:

  1. Das Logging-Modul möchte sich in UTC einloggen, also würde ich etwas wie 10: 21.44 und einen +0000 Offset bekommen;
  2. Das Logging-Modul möchte sich in der Ortszeit einloggen, also würde ich etwas wie 11:21:44 und einen +01000-Offset bekommen;
  3. Das Logging-Modul bietet naive Datetime-Objekte, und wir bekommen absolut nichts als Offset.

Im Gegenteil, hier scheint ich ein unberechenbares - und eindeutig falsches - Ergebnis zu bekommen. Was geht? Ist es möglich, das Logging-Modul zu konfigurieren, was ich will OHNE die Konverterfunktion der Protokollierung zu überschreiben.Formatter-Objekte (wo kann ich natürlich tun, was ich will, aber das sieht einfach ein Fehler für mich aus)?

    
Alan Franzoni 09.01.2015, 10:27
quelle

2 Antworten

6

logging verwendet das Modul time , das die Zeitzone nicht in einem Zeittupel speichert und time.strftime() im Gegensatz zu datetime.strftime() unterstützt nicht %z auf Python 2. Sie können Formatter.formatTime() Methode überschreiben, um Zeitzone zu verwenden -aware datetime objects als @dmg vorgeschlagen stattdessen:

%Vor%

Ausgabe

%Vor%     
jfs 09.01.2015 17:14
quelle
5

BEARBEITEN:

Sie können den Zeitformatierer wie folgt einstellen:

%Vor%

um Ortszeit zu erhalten.

Oder:

%Vor%

um UTC zu bekommen.

Wie für die lokale Zeit + Zeitzone verwendet logging.Formatter zuerst die Zeit, die Sie als sehen können hier unterstützt TZ nicht wirklich (siehe Fußnote).

Die sauberste Alternative wäre, einen eigenen Formatierer zu schreiben, der datetime verwendet, was anscheinend ziemlich genau dummer Weg TZ zu verwenden. Um Ihr Objekt "bewusst" zu machen, würde ich mit pytz gehen.

    
dmg 09.01.2015 10:40
quelle