263 votes

Journalisation Python: utilisez les millisecondes au format heure

Par défaut logging.Formatter('%(asctime)s') d'impressions avec le format suivant:

2011-06-09 10:54:40,638

où 638 est de l'ordre de la milliseconde. J'ai besoin de changer la virgule pour un point:

2011-06-09 10:54:40.638

Pour formater le temps que je peux utiliser:

logging.Formatter(fmt='%(asctime)s',datestr=date_format_str)

toutefois, la documentation ne précise pas comment formater millisecondes. J'ai trouvé ce DONC, la question qui parle de microsecondes, mais a) je préfère millisecondes et b) ce qui suit ne fonctionne pas sur la version 2.6 de Python (je travaille sur) en raison de l' %f:

logging.Formatter(fmt='%(asctime)s',datefmt='%Y-%m-%d,%H:%M:%S.%f')

493voto

Craig McDaniel Points 781

Cela devrait fonctionner aussi:

 logging.Formatter(fmt='%(asctime)s.%(msecs)d',datefmt='%Y-%m-%d,%H:%M:%S')
 

95voto

unutbu Points 222216

la journalisation.Formateur de l' formatTime méthode ressemble à ceci:

def formatTime(self, record, datefmt=None):
    ct = self.converter(record.created)
    if datefmt:
        s = time.strftime(datefmt, ct)
    else:
        t = time.strftime("%Y-%m-%d %H:%M:%S", ct)
        s = "%s,%03d" % (t, record.msecs)
    return s

Avis de la virgule en "%s,%03d". Ce ne peut pas être fixé par la spécification d'un datefmt car ct est time.struct_time et que ces objets n'enregistrez pas en millisecondes.

Si on change la définition de l' ct pour en faire un datetime objet au lieu d'un struct_time, alors (au moins avec les versions modernes de Python), nous pouvons l'appeler ct.strftime et ensuite, nous pouvons utiliser %f pour le format de microsecondes:

import logging
import datetime as dt

class MyFormatter(logging.Formatter):
    converter=dt.datetime.fromtimestamp
    def formatTime(self, record, datefmt=None):
        ct = self.converter(record.created)
        if datefmt:
            s = ct.strftime(datefmt)
        else:
            t = ct.strftime("%Y-%m-%d %H:%M:%S")
            s = "%s,%03d" % (t, record.msecs)
        return s

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

console = logging.StreamHandler()
logger.addHandler(console)

formatter = MyFormatter(fmt='%(asctime)s %(message)s',datefmt='%Y-%m-%d,%H:%M:%S.%f')
console.setFormatter(formatter)

logger.debug('Jackdaws love my big sphinx of quartz.')
# 2011-06-09,07:12:36.553554 Jackdaws love my big sphinx of quartz.

Ou, pour obtenir de millisecondes, changer la virgule à la place d'une virgule, et omettre l' datefmt argument:

class MyFormatter(logging.Formatter):
    converter=dt.datetime.fromtimestamp
    def formatTime(self, record, datefmt=None):
        ct = self.converter(record.created)
        if datefmt:
            s = ct.strftime(datefmt)
        else:
            t = ct.strftime("%Y-%m-%d %H:%M:%S")
            s = "%s.%03d" % (t, record.msecs)
        return s

...
formatter = MyFormatter(fmt='%(asctime)s %(message)s')
...
logger.debug('Jackdaws love my big sphinx of quartz.')
# 2011-06-09 08:14:38.343 Jackdaws love my big sphinx of quartz.

4voto

Jonathan Points 11842

Après avoir instancié un Formatter je règle généralement formatter.converter = gmtime . Donc, pour que la réponse de @ unutbu fonctionne dans ce cas, vous aurez besoin de:

 class MyFormatter(logging.Formatter):
    def formatTime(self, record, datefmt=None):
        ct = self.converter(record.created)
        if datefmt:
            s = time.strftime(datefmt, ct)
        else:
            t = time.strftime("%Y-%m-%d %H:%M:%S", ct)
            s = "%s.%03d" % (t, record.msecs)
        return s
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X