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
War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top