Domyślnie logging.Formatter('%(asctime)s')
drukuje w następującym formacie:
2011-06-09 10:54:40,638
gdzie 638 to milisekunda. Muszę zmienić przecinek na kropkę:
2011-06-09 10:54:40.638
Aby sformatować czas, którego mogę użyć:
logging.Formatter(fmt='%(asctime)s',datestr=date_format_str)
jednak dokumentacja nie określa, jak formatować milisekundy. Znalazłem to pytanie SO, które mówi o mikrosekundach, ale a) wolałbym milisekundy ib) poniższe nie działa w Pythonie 2.6 (nad którym pracuję) z powodu %f
:
logging.Formatter(fmt='%(asctime)s',datefmt='%Y-%m-%d,%H:%M:%S.%f')
%f
nie działa również na Pythonie 2.7.9 lub 3.5.1logging
twierdzi, że jego domyślny format czasu jest zgodny z ISO 8601. Tak nie jest. Używa spacji, a nie „T” do oddzielania czasu i przecinka dla ułamków sekund, a nie kropki dziesiętnej. Jak mogli się tak mylić?Odpowiedzi:
Proszę zauważyć, że rozwiązanie Craiga McDaniela jest wyraźnie lepsze.
logowanie.
formatTime
metoda formatowania wygląda następująco:Zwróć uwagę na przecinek w
"%s,%03d"
. Nie można tego naprawić, określając a,datefmt
ponieważct
jest a,time.struct_time
a te obiekty nie rejestrują milisekund.Jeśli zmienimy definicję,
ct
aby uczynić godatetime
obiektem zamiast astruct_time
, to (przynajmniej w nowoczesnych wersjach Pythona) możemy wywołać,ct.strftime
a następnie użyć%f
do sformatowania mikrosekund:Lub, aby uzyskać milisekundy, zmień przecinek na kropkę dziesiętną i pomiń
datefmt
argument:źródło
%f
podaje mikrosekundy. Przypuszczam, że najłatwiejszym sposobem uzyskania milisekund jest zmiana przecinka na przecinek dziesiętny (patrz edycja powyżej).To też powinno działać:
źródło
%z
lub%Z
w swoimdatefmt
chcesz, aby pojawiło się PO msecs, a nie wcześniej.AM
lubPM
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
(od Pythona 3.7), ponieważ podstawiane są tylko czas i milisekundy. Zelogging
źródła:self.default_msec_format % (t, record.msecs)
Dodanie msecs było lepszą opcją, dzięki. Oto moja poprawka wykorzystująca to w Pythonie 3.5.3 w Blenderze
źródło
Najprostszym sposobem, jaki znalazłem, było zastąpienie default_msec_format:
źródło
Po utworzeniu instancji
Formatter
zwykle ustawiamformatter.converter = gmtime
. Aby więc odpowiedź @ unutbu zadziałała w tym przypadku, potrzebujesz:źródło
Prostym rozszerzeniem, które nie wymaga
datetime
modułu i nie jest upośledzone, jak niektóre inne rozwiązania, jest użycie prostej zamiany ciągu, jak na przykład:W ten sposób format daty można zapisać w dowolny sposób, nawet uwzględniając różnice między regionami, używając
%F
milisekund. Na przykład:źródło
Jeśli używasz strzałki lub nie masz nic przeciwko używaniu strzałki. Formatowanie czasu w Pythonie można zastąpić formatowaniem czasu strzałki.
Teraz możesz użyć całego formatowania czasu strzałki w
datefmt
atrybucie.źródło
tl; dr dla osób szukających tutaj daty w formacie ISO:
datefmt: '% Y-% m-% d% H:% M:% S.% 03d% z'
źródło
W tej chwili poniższe działa doskonale z Pythonem 3.
daje następujący wynik
źródło