Standardmäßig wird logging.Formatter('%(asctime)s')
im folgenden Format gedruckt:
2011-06-09 10:54:40,638
wobei 638 die Millisekunde ist. Ich muss das Komma in einen Punkt ändern:
2011-06-09 10:54:40.638
So formatieren Sie die Zeit, die ich verwenden kann:
logging.Formatter(fmt='%(asctime)s',datestr=date_format_str)
In der Dokumentation wird jedoch nicht angegeben, wie Millisekunden formatiert werden sollen. Ich habe diese SO-Frage gefunden, die sich mit Mikrosekunden befasst, aber a) ich würde Millisekunden bevorzugen und b) das Folgende funktioniert unter Python 2.6 (an dem ich arbeite) nicht, weil %f
:
logging.Formatter(fmt='%(asctime)s',datefmt='%Y-%m-%d,%H:%M:%S.%f')
%f
funktioniert auch nicht mit Python 2.7.9 oder 3.5.1logging
behauptet wird, dass das Standardzeitformat ISO 8601 entspricht. Es verwendet Leerzeichen, nicht "T", um Zeit und Komma für Sekundenbruchteile zu trennen, nicht Dezimalpunkt. Wie konnten sie so falsch sein?Antworten:
Bitte beachten Sie, dass die Lösung von Craig McDaniel deutlich besser ist.
Die
formatTime
Methode von logging.Formatter sieht folgendermaßen aus:Beachten Sie das Komma in
"%s,%03d"
. Dies kann nicht durch Angabe von a behoben werden,datefmt
da act
isttime.struct_time
und diese Objekte keine Millisekunden aufzeichnen.Wenn wir die Definition von ändern
ct
, um es zu einemdatetime
Objekt anstelle von a zu machen, können wirstruct_time
(zumindest bei modernen Versionen von Python) aufrufenct.strftime
und dann%f
Mikrosekunden formatieren:Um Millisekunden zu erhalten, ändern Sie das Komma in einen Dezimalpunkt und lassen Sie das
datefmt
Argument weg :quelle
%f
gibt Mikrosekunden. Ich nehme an, der einfachste Weg, Millisekunden zu erhalten, besteht darin, das Komma in einen Dezimalpunkt zu ändern (siehe oben).Das sollte auch funktionieren:
quelle
%z
oder%Z
in Ihrem habendatefmt
, möchten Sie, dass das NACH den ms erscheint, nicht vorher.AM
oderPM
from time import gmtime
-# Use UTC rather than local date/time
-logging.Formatter.converter = gmtime
-logging.basicConfig(datefmt='%Y-%m-%dT%H:%M:%S', format='%(name)s | %(asctime)s.%(msecs)03dZ | %(message)s', level=log_level)
default_msec_format
(ab Python 3.7) einbetten, da nur die Zeit und Millisekunden ersetzt werden. Aus derlogging
Quelle:self.default_msec_format % (t, record.msecs)
Das Hinzufügen von ms war die bessere Option. Danke. Hier ist meine Änderung, die dies mit Python 3.5.3 in Blender verwendet
quelle
Der einfachste Weg, den ich gefunden habe, war das Überschreiben von default_msec_format:
quelle
Nach dem Instanziieren eines
Formatter
setze ich normalerweiseformatter.converter = gmtime
. Damit die Antwort von @ unutbu in diesem Fall funktioniert, benötigen Sie:quelle
Eine einfache Erweiterung, die das
datetime
Modul nicht benötigt und nicht wie einige andere Lösungen behindert ist, besteht darin, einen einfachen String-Ersatz wie folgt zu verwenden:Auf diese Weise kann ein Datumsformat geschrieben werden, wie Sie möchten, auch unter Berücksichtigung von Regionsunterschieden, indem es
%F
für Millisekunden verwendet wird. Beispielsweise:quelle
Wenn Sie Pfeil verwenden oder wenn es Ihnen nichts ausmacht, Pfeil zu verwenden. Sie können die Zeitformatierung von Python durch die von Pfeil ersetzen.
Jetzt können Sie die gesamte Zeitformatierung des Pfeils im
datefmt
Attribut verwenden.quelle
tl; dr für Leute, die hier nach einem ISO-formatierten Datum suchen:
Datum: '% Y-% m-% d% H:% M:% S.% 03d% z'
quelle
Ab sofort funktioniert das Folgende perfekt mit Python 3.
gibt die folgende Ausgabe
quelle