По умолчанию logging.Formatter('%(asctime)s')
печатает в следующем формате:
2011-06-09 10:54:40,638
где 638 - миллисекунда. Мне нужно изменить запятую на точку:
2011-06-09 10:54:40.638
Для форматирования времени я могу использовать:
logging.Formatter(fmt='%(asctime)s',datestr=date_format_str)
Однако документации не указано, как форматировать миллисекунды. Я нашел этот вопрос, который говорит о микросекундах, но а) я бы предпочел миллисекунды и б) следующее не работает на Python 2.6 (над которым я работаю) из-за %f
:
logging.Formatter(fmt='%(asctime)s',datefmt='%Y-%m-%d,%H:%M:%S.%f')
%f
не работает на Python 2.7.9 или 3.5.1 либоlogging
утверждает, что его формат времени по умолчанию соответствует ISO 8601. Это не так. Он использует пробел, а не «Т» для разделения времени и запятой на доли секунды, а не десятичную точку. Как они могли быть такими неправыми?Ответы:
Обратите внимание, что решение Крейга МакДаниэля явно лучше.
Метод logging.Formatter
formatTime
выглядит так:Обратите внимание на запятую в
"%s,%03d"
. Это не может быть исправлено путем указанияdatefmt
потому чтоct
является,time.struct_time
и эти объекты не записывают миллисекунды.Если мы изменим определение,
ct
чтобы сделать егоdatetime
объектом вместо astruct_time
, то (по крайней мере, в современных версиях Python) мы сможем вызватьct.strftime
и затем использовать%f
для форматирования микросекунд:Или, чтобы получить миллисекунды, измените запятую на десятичную точку и пропустите
datefmt
аргумент:источник
%f
дает микросекунды. Я полагаю, что самый простой способ получить миллисекунды - это заменить запятую на десятичную точку (см. Выше).Это должно работать тоже:
источник
%z
или%Z
в вашем,datefmt
вы хотите, чтобы это появилось ПОСЛЕ мсек, а не раньше.AM
илиPM
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
( начиная с Python 3.7), потому что в нем подставляются только время и миллисекунды. Изlogging
источника:self.default_msec_format % (t, record.msecs)
Добавление msecs было лучшим вариантом, спасибо. Вот моя поправка, использующая это с Python 3.5.3 в Blender
источник
Самый простой способ, который я нашел, это переопределить default_msec_format:
источник
После создания экземпляра
Formatter
я обычно устанавливаюformatter.converter = gmtime
. Таким образом, чтобы ответ @ unutbu работал в этом случае, вам нужно:источник
Простое расширение, которое не требует
datetime
модуля и не является недостатком, как некоторые другие решения, заключается в использовании простой замены строк, например, так:Таким образом, формат даты может быть записан так, как вы хотите, даже учитывая различия по регионам, используя в
%F
течение миллисекунд. Например:источник
Если вы используете стрелку или если вы не против использовать стрелку. Вы можете заменить форматирование времени Python стрелкой.
Теперь вы можете использовать все стрелки времени форматирования в
datefmt
атрибуте.источник
tl; dr для людей, ищущих здесь дату в формате ISO:
datefmt: '% Y-% m-% d% H:% M:% S.% 03d% z'
источник
На данный момент следующее отлично работает с Python 3.
дает следующий вывод
источник