Par défaut, logging.Formatter('%(asctime)s')
imprime avec le format suivant:
2011-06-09 10:54:40,638
où 638 est la milliseconde. J'ai besoin de changer la virgule en point:
2011-06-09 10:54:40.638
Pour formater l'heure que je peux utiliser:
logging.Formatter(fmt='%(asctime)s',datestr=date_format_str)
cependant la documentation ne spécifie pas comment formater les millisecondes. J'ai trouvé cette question SO qui parle de microsecondes, mais a) je préférerais les millisecondes et b) ce qui suit ne fonctionne pas sur Python 2.6 (sur lequel je travaille) en raison de %f
:
logging.Formatter(fmt='%(asctime)s',datefmt='%Y-%m-%d,%H:%M:%S.%f')
%f
ne fonctionne pas non plus sur python 2.7.9 ou 3.5.1logging
que le format de l'heure par défaut suit ISO 8601. Ce n'est pas le cas. Il utilise l'espace, pas "T" pour séparer le temps et la virgule pour les fractions de seconde, pas la virgule décimale. Comment ont-ils pu se tromper?Réponses:
Veuillez noter que la solution de Craig McDaniel est clairement meilleure.
La
formatTime
méthode de Formatter ressemble à ceci:Remarquez la virgule
"%s,%03d"
. Cela ne peut pas être résolu en spécifiant undatefmt
carct
est untime.struct_time
et ces objets n'enregistrent pas les millisecondes.Si nous changeons la définition de
ct
pour en faire undatetime
objet au lieu de astruct_time
, alors (au moins avec les versions modernes de Python) nous pouvons appelerct.strftime
et ensuite nous pouvons utiliser%f
pour formater les microsecondes:Ou, pour obtenir des millisecondes, remplacez la virgule par une virgule décimale et omettez l'
datefmt
argument:la source
%f
donne des microsecondes. Je suppose que le moyen le plus simple d'obtenir des millisecondes est de changer la virgule en un point décimal (voir la modification ci-dessus).Cela devrait également fonctionner:
la source
%z
ou%Z
dans votredatefmt
vous voulez que cela apparaisse APRÈS les msecs, pas avant.AM
ouPM
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
(à partir de Python 3.7) car seuls l'heure et les millisecondes sont remplacées. De lalogging
source:self.default_msec_format % (t, record.msecs)
L'ajout de msecs était la meilleure option, merci. Voici mon amendement en utilisant ceci avec Python 3.5.3 dans Blender
la source
Le moyen le plus simple que j'ai trouvé était de remplacer default_msec_format:
la source
Après avoir instancié un,
Formatter
j'ai généralement définiformatter.converter = gmtime
. Donc, pour que la réponse de @ unutbu fonctionne dans ce cas, vous aurez besoin de:la source
Une extension simple qui ne nécessite pas le
datetime
module et qui n'est pas handicapée comme certaines autres solutions consiste à utiliser un simple remplacement de chaîne comme ceci:De cette façon, un format de date peut être écrit comme vous le souhaitez, même en tenant compte des différences de région, en utilisant
%F
pendant des millisecondes. Par exemple:la source
Si vous utilisez la flèche ou si cela ne vous dérange pas d'utiliser la flèche. Vous pouvez remplacer le formatage de l'heure de python par celui de la flèche.
Vous pouvez maintenant utiliser toute la mise en forme de l'heure de la flèche dans l'
datefmt
attribut.la source
tl; dr pour les personnes qui recherchent ici une date au format ISO:
datefmt: '% Y-% m-% d% H:% M:% S.% 03d% z'
la source
À partir de maintenant, ce qui suit fonctionne parfaitement avec python 3.
donne la sortie suivante
la source