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')
%f
tampoco funciona en Python 2.7.9 o 3.5.1logging
afirma 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
formatTime
método de Formatter se ve así:Observe la coma en
"%s,%03d"
. Esto no se puede solucionar especificando undatefmt
porquect
es atime.struct_time
y estos objetos no registran milisegundos.Si cambiamos la definición de
ct
para que sea undatetime
objeto en lugar de unstruct_time
, entonces (al menos con las versiones modernas de Python) podemos llamarct.strftime
y luego podemos usar%f
para formatear microsegundos:O, para obtener milisegundos, cambie la coma a un punto decimal y omita el
datefmt
argumento:fuente
%f
da 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
%z
o%Z
en tudatefmt
quieres que para que aparezca después de los milisegundos, no antes.AM
oPM
from 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 lalogging
fuente: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
datetime
mó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
%F
milisegundos. 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
datefmt
atributo.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