Question

Après la documentation Python , je suis en train de remplacement logging.Formatter.converter afin de contrôler le temps connecté
Comme vous pouvez le voir ci-dessous -.. les millisecondes ne sont pas surchargée (ils sont les millisecondes de temps en cours)

Comment venir? Comment puis-je contrôler les millisecondes ainsi?

>>> 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
Était-ce utile?

La solution

override logging.Formatter.formatTime() au lieu avec ceci:

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

Si vous avez besoin pour tous les enregistreurs de ce processus, vous pouvez remplacer la fonction de la classe elle-même, mais le faire juste après la première déclaration de import logging vos rencontres de code:

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

Autres conseils

timetuple() n'utilise pas millisecondes, de sorte que les ms informations contenues dans l'objet datetime est perdu une fois que la méthode est appelée:

>>> 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)

Notez que ce n'est pas une limitation de cette méthode particulière, mais plutôt de la type time.struct_time .

La ligne de fond est: si vous avez besoin de remplacer l'horodatage, ne passe pas par un objet time.struct_time. Vous pouvez - par exemple - passer l'horodatage déjà formaté comme une chaîne, plutôt que d'un temps faux. En fonction de vos besoins, il est peut-être de meilleures méthodes, bien sûr!

Voici un meilleur exemple qui vous permet de remplacer le temps qui a été généré, comme la réponse acceptée n'a pas vraiment le faire.

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)

Pour l'activer:

logging.Formatter.converter=inSimulatedTime
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top