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.