Módulo de registro de Python marca de tiempo de registro para incluir microsegundos

Estoy usando el módulo de registro de python para los registros, pero necesitaba la marca de tiempo para incluir microsegundos Parece que la marca de tiempo solo puede ser tan precisa como milisegundos. Aquí está mi código de prueba

import logging logging.basicConfig(format='%(asctime)s %(levelname)s {%(module)s} [%(funcName)s] %(message)s', datefmt='%Y-%m-%d,%H:%M:%S:%f', level=logging.INFO) class log2_test(): def test_class(self): logging.warning("Warning2 inside the class") def get_started2(): logging.info("Logged2 Here") if __name__ == '__main__': get_started2() 

Aquí está la salida que obtengo –

 2015-07-09,16:36:37:f INFO {logger} [get_started2] Logged2 Here 

De alguna manera,% f no es reconocido. La versión de Python es 2.7.6.

¿Cómo obtengo la marca de tiempo para incluir microsegundos? Gracias por adelantado.

No creo que strftime() soporte el %f directamente. Sin embargo, el registrador proporciona milisegundos como un atributo msecs separado, por lo que puede agregarlo usted mismo después de la marca de tiempo existente de la siguiente manera:

 logging.basicConfig(format='%(asctime)s.%(msecs)03d %(levelname)s {%(module)s} [%(funcName)s] %(message)s', datefmt='%Y-%m-%d,%H:%M:%S', level=logging.INFO) 

Esto me dio la siguiente salida usando tu script:

 2015-07-10,09:21:16.841 INFO {test script} [get_started2] Logged2 Here 

No encontré una manera fácil de imprimir en microsegundos, pero %(created).6f podría ser una solución temporal, que será el resultado de time.time() , como 1517080746.007748 .

No encontraste una manera de eliminar partes innecesarias, así que si realmente necesitas un microsegundo, pero no quieres cambiar tu código demasiado, una forma fácil será

logging.basicConfig(level=logging.INFO,format="%(asctime)s.%(msecs)03d[%(levelname)-8s]:%(created).6f %(message)s", datefmt="%Y-%m-%d %H:%M:%S")

Te dará por debajo de la salida,

 2018-01-28 04:19:06.807[INFO ]:1517080746.807794 buy order issued 2018-01-28 04:19:07.007[INFO ]:1517080747.007806 buy order issued 2018-01-28 04:19:07.207[INFO ]:1517080747.207817 buy order issued 2018-01-28 04:19:07.407[INFO ]:1517080747.407829 buy order issued 2018-01-28 04:19:07.607[INFO ]:1517080747.607840 buy order issued 

Acabo de encontrarme con este problema, y ​​se puede resolver. Solo requiere un poco de piratería en algunas de las infraestructuras de registro. Vea el siguiente ejemplo:

 import logging import time try: # Python >= 3.7 from time import time_ns except: # Python <= 3.6 from time import time as _time_ time_ns = lambda: int(_time_() * 1e9) class LogRecord_ns(logging.LogRecord): def __init__(self, *args, **kwargs): self.created_ns = time_ns() # Fetch precise timestamp super().__init__(*args, **kwargs) class Formatter_ns(logging.Formatter): default_nsec_format = '%s,%09d' def formatTime(self, record, datefmt=None): if datefmt is not None: # Do not handle custom formats here ... return super().formatTime(record, datefmt) # ... leave to original implementation ct = self.converter(record.created_ns / 1e9) t = time.strftime(self.default_time_format, ct) s = self.default_nsec_format % (t, record.created_ns - (record.created_ns // 10**9) * 10**9) return s logging.setLogRecordFactory(LogRecord_ns) # +++++ DEMO +++++ log_formater = Formatter_ns('%(asctime)s (%(name)s) %(message)s') logger = logging.getLogger('demo-log') logger.setLevel(logging.DEBUG) ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(log_formater) logger.addHandler(ch) logger.info('foo bar') 

Esto se imprimirá felizmente: 2019-04-10 14:08:28,819931368 (demo-log) foo bar

La clave para esto es una clase logging.Formatter modificada, que tiene una implementación personalizada de formatTime . Solo para estar seguro, también recomiendo usar time.time_ns , que devolverá un número entero en nano segundos en Python 3.7 y más. El tiempo original.tiempo devuelve un flotante en segundos, lo que obviamente tiene problemas de precisión. La obtención de la marca de tiempo más precisa en un registro se logra a través de una clase logging.LogRecord modificada, que simplemente obtiene su campo time.time_ns de time.time_ns en su método constructor extendido.