write values multiple loggeradapter logger log example disable_existing_loggers python logging time

values - Registro de Python: utilice milisegundos en formato de tiempo



python logging level values (7)

De forma predeterminada, logging.Formatter(''%(asctime)s'') imprime con el siguiente formato:

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

donde 638 es el milisegundo. Necesito cambiar la coma a un punto:

2011-06-09 10:54:40.638

Para formatear el tiempo que puedo usar:

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

sin embargo, la documentation no especifica cómo formatear milisegundos. He encontrado esta pregunta ASÍ que habla de microsegundos, pero a) Preferiría milisegundos yb) lo siguiente no funciona en Python 2.6 (en el que estoy trabajando) debido al %f :

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


Agregar msecs era la mejor opción, gracias. Aquí está mi enmienda usando esto con Python 3.5.3 en Blender

import logging logging.basicConfig(level=logging.DEBUG, format=''%(asctime)s.%(msecs)03d %(levelname)s:/t%(message)s'', datefmt=''%Y-%m-%d %H:%M:%S'') log = logging.getLogger(__name__) log.info("Logging Info") log.debug("Logging Debug")


Después de crear instancias de un Formatter , generalmente configuro formatter.converter = gmtime . Entonces para que la respuesta de @ unutbu funcione en este caso necesitarás:

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


Esto debería funcionar también:

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


La forma más sencilla que encontré fue sobrescribir default_msec_format:

formatter = logging.Formatter(''%(asctime)s'') formatter.default_msec_format = ''%s.%03d''


Si está utilizando la arrow o si no le importa usar la flecha. Puede sustituir el formato de hora de python por el de flecha.

import logging from arrow.arrow import Arrow class ArrowTimeFormatter(logging.Formatter): def formatTime(self, record, datefmt=None): arrow_time = Arrow.fromtimestamp(record.created) if datefmt: arrow_time = arrow_time.format(datefmt) return str(arrow_time) logger = logging.getLogger(__name__) default_handler = logging.StreamHandler() default_handler.setFormatter(ArrowTimeFormatter( fmt=''%(asctime)s'', datefmt=''YYYY-MM-DD HH:mm:ss.SSS'' )) logger.setLevel(logging.DEBUG) logger.addHandler(default_handler)

Ahora puede usar todo el formato de hora de la flecha en el atributo datefmt .


Una simple expansión que no requiere el módulo de datetime y datetime y no está restringida como algunas otras soluciones es usar un simple reemplazo de cadena de la siguiente manera:

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

De esta forma, se puede escribir un formato de fecha como lo desee, incluso teniendo en cuenta las diferencias de región, utilizando %F durante milisegundos. Por ejemplo:

log = logging.getLogger(__name__) log.setLevel(logging.INFO) sh = logging.StreamHandler() log.addHandler(sh) fm = MyFormatter(fmt=''%(asctime)s-%(levelname)s-%(message)s'',datefmt=''%H:%M:%S.%F'') sh.setFormatter(fm) log.info("Foo, Bar, Baz") # 03:26:33.757-INFO-Foo, Bar, Baz


Tenga en cuenta que la solución de Craig McDaniel es claramente mejor.

logging.Formatter''s formatTime método se ve así:

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

Observe la coma en "%s,%03d" . Esto no se puede solucionar especificando un datefmt porque ct es time.struct_time y estos objetos no registran milisegundos.

Si cambiamos la definición de ct para convertirlo en un objeto datetime lugar de struct_time , entonces (al menos con las versiones modernas de Python) podemos llamar a ct.strftime y luego podemos usar %f para formatear microsegundos:

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.

O, para obtener milisegundos, cambie la coma a un punto decimal y omita el argumento datefmt :

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.