Por defecto 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 documentación no especifica cómo formatear milisegundos. He encontrado esta pregunta SO que habla de microsegundos, pero a) preferiría milisegundos yb) lo siguiente no funciona en Python 2.6 (en el que estoy trabajando) debido a %f:
logging.Formatter(fmt='%(asctime)s',datefmt='%Y-%m-%d,%H:%M:%S.%f')

%ftampoco funciona en Python 2.7.9 o 3.5.1loggingafirma que su formato de hora predeterminado sigue ISO 8601. No lo hace. Utiliza el espacio, no "T" para separar el tiempo y la coma durante segundos fraccionarios, no el punto decimal. ¿Cómo podrían estar tan equivocados?Respuestas:
Tenga en cuenta que la solución de Craig McDaniel es claramente mejor.
El
formatTimemétodo de Formatter se ve así:Observe la coma en
"%s,%03d". Esto no se puede solucionar especificando undatefmtporquectes atime.struct_timey estos objetos no registran milisegundos.Si cambiamos la definición de
ctpara que sea undatetimeobjeto en lugar de unstruct_time, entonces (al menos con las versiones modernas de Python) podemos llamarct.strftimey luego podemos usar%fpara formatear microsegundos:O, para obtener milisegundos, cambie la coma a un punto decimal y omita el
datefmtargumento:fuente
%fda microsegundos. Supongo que la forma más fácil de obtener milisegundos es cambiar la coma a un punto decimal (consulte la edición anterior).Esto también debería funcionar:
fuente
%zo%Zen tudatefmtquieres que para que aparezca después de los milisegundos, no antes.AMoPMfrom time import gmtime-# Use UTC rather than local date/time-logging.Formatter.converter = gmtime-logging.basicConfig(datefmt='%Y-%m-%dT%H:%M:%S', format='%(name)s | %(asctime)s.%(msecs)03dZ | %(message)s', level=log_level)default_msec_format(a partir de Python 3.7) porque solo se sustituyen la hora y los milisegundos. De laloggingfuente:self.default_msec_format % (t, record.msecs)Agregar msecs fue la mejor opción, gracias. Aquí está mi enmienda usando esto con Python 3.5.3 en Blender
fuente
La forma más simple que encontré fue anular default_msec_format:
fuente
Después de crear una instancia
Formatter, generalmente configuroformatter.converter = gmtime. Entonces, para que la respuesta de @ unutbu funcione en este caso, necesitará:fuente
Una expansión simple que no requiere el
datetimemódulo y que no se ve obstaculizada como otras soluciones es usar un reemplazo de cadena simple de esta manera:De esta manera, se puede escribir un formato de fecha como desee, incluso teniendo en cuenta las diferencias de región, utilizando
%Fmilisegundos. Por ejemplo:fuente
Si está usando flecha o si no le importa usar flecha. Puede sustituir el formato de hora de Python por el de flecha.
Ahora puede usar todo el formato de tiempo de la flecha en el
datefmtatributo.fuente
tl; dr para personas que buscan aquí una fecha con formato ISO:
datefmt: '% Y-% m-% d% H:% M:% S.% 03d% z'
fuente
A partir de ahora, lo siguiente funciona perfectamente con Python 3.
da el siguiente resultado
fuente