Использовать количество секунд с начала эпохи UNIX в качестве формата даты в журнале - PullRequest
2 голосов
/ 30 июня 2019

Документы для logging.basicConfig говорят:

datefmt - использовать указанный формат даты / времени, принятый time.strftime().

Однако, если я взгляну на документы по time.strftime(), отметка времени эпохи UNIX там даже не упоминается.


Обновление: Если я использую %s, как описано в справочной странице для strftime(3), он работает с Linux, но не с Windows.

import time
time.strftime('%s')

приводит к

ValueError: Invalid format string

Поэтому я ищу независимый от платформы способ использования количества секунд с начала эпохи UNIX в качестве формата даты при ведении журнала.

Ответы [ 2 ]

2 голосов
/ 01 июля 2019

Это невозможно сделать с asctime наверняка, так как поведение strftime в отношении поддерживаемых строк формата зависит от платформы.

В документации есть параграф в разделе "strftime() и strptime() Behavior "об этом:

Полный набор поддерживаемых кодов формата варьируется в зависимости от платформы, поскольку Python вызывает функцию strftime() библиотеки С для платформы C, и вариации платформы являются общими.Чтобы увидеть полный набор кодов формата, поддерживаемых на вашей платформе, обратитесь к документации strftime (3) .

https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior


Однако,игнорируя asctime, вы все равно можете использовать количество секунд, прошедших с начала эпохи UNIX, в строке формата logginng.Есть еще один атрибут, который называется created:

%(created)f - Время создания LogRecord (возвращаемое time.time()).

https://docs.python.org/3/library/logging.html#logrecord-attributes

Поскольку time.time() работает как в Linux, так и в Windows, вы можете просто использовать created вместо asctime в строке формата ведения журнала.

1 голос
/ 01 июля 2019

Формат эпохи Unix не может быть получен с использованием strftime() в ANSI C (в конце концов, это тип ввода).Точно так же вы не можете использовать эту функциональность в качестве кроссплатформенного в Python.

Однако вы можете воспользоваться тем, что нестандартные символы проходят через strftime() как в C, так и в Python.Следовательно, вы можете использовать следующее - по общему признанию, довольно уродливое, но эффективное - обходное решение:

import time

time.strftime(str(time.time()))

или, точнее:

time.strftime(str(int(time.time())))

time.strftime(str(int(time.time()))) == time.strftime('%s')
# True
...