Python -Protokollierung: Überschreibung der Protokollzeit überschreiben
-
28-10-2019 - |
Frage
Folgen Pythons Dokumentation, Ich versuche überschreiben logging.Formatter.converter
Um die angemeldete Zeit zu kontrollieren.
Wie Sie unten sehen können - Die Millisekunden wurden nicht außer Kraft gesetzt (Sie sind die aktuelle Zeit Millisekunden).
Woher? Wie kann ich auch die Millisekunden kontrollieren?
>>> import logging, datetime
>>> formatter = logging.Formatter('%(asctime)s:%(message)s')
>>> handler = logging.StreamHandler()
>>> handler.setFormatter(formatter)
>>> def sim_time(t):
... return datetime.datetime(2000,1,2,3,4,5,678).timetuple()
...
>>> formatter.converter = sim_time
>>> log = logging.getLogger('test')
>>> log.addHandler(handler)
>>> log.info('hi')
2000-01-02 03:04:05,898:hi
>>> log.info('hi')
2000-01-02 03:04:05,914:hi
>>> log.info('hi')
2000-01-02 03:04:05,434:hi
Lösung
überschreiben logging.Formatter.formatTime()
Stattdessen damit:
def sim_time(record, datefmt=None):
return datetime.datetime(2000,1,2,3,4,5,678).strftime('%Y-%m-%d %H:%M:%S,%f')[:-3]
formatter.formatTime = sim_time
Wenn Sie es für alle Logger in diesem Prozess benötigen, können Sie die Klassenfunktion selbst überschreiben, dies jedoch direkt nach dem ersten tun import logging
Anweisung Ihre Code -Begegnungen:
def sim_time(self, record, datefmt=None):
return datetime.datetime(2000,1,2,3,4,5,678).strftime('%Y-%m-%d %H:%M:%S,%f')[:-3]
import logging
logging.Formatter.formatTime = sim_time
Andere Tipps
timetuple()
Verwendet keine Millisekunden, so dass die im DateTime -Objekt enthaltenen MS -Informationen verloren gehen, sobald die Methode aufgerufen wird:
>>> d
datetime.datetime(2000, 1, 2, 3, 4, 5, 678)
>>> d.timetuple()
time.struct_time(tm_year=2000, tm_mon=1, tm_mday=2, tm_hour=3, tm_min=4, tm_sec=5, tm_wday=6, tm_yday=2, tm_isdst=-1)
Beachten Sie, dass dies keine Einschränkung dieser bestimmten Methode ist, sondern der time.struct_time
Typ.
Das Fazit lautet: Wenn Sie den Zeitstempel außer Kraft setzen müssen, gehen Sie nicht durch a time.struct_time
Objekt. Sie könnten - zum Beispiel - den Zeitstempel übergeben, der bereits als Zeichenfolge formatiert ist, und nicht als gefälschte Zeit. Abhängig von Ihren Bedürfnissen gibt es natürlich bessere Methoden!
Hier ist ein besseres Beispiel, mit dem Sie die generierte Zeit ersetzen können, da die akzeptierte Antwort das nicht wirklich getan hat.
def inSimulatedTime(self,secs=None):
global myTimeKeeper
try:
ts=myTimeKeeper.getCurrentTimeLocal() # returns a datetime.datetime object
return ts.timetuple()
except Exception as e:
#sometimes my timekeeper hasn't been initialized yet.
return time.localtime(secs)
Um es zu aktivieren:
logging.Formatter.converter=inSimulatedTime