Как настроить формат времени для регистрации в Python?

200

Я новичок в пакете регистрации Python и планирую использовать его для своего проекта. Я хотел бы настроить формат времени на свой вкус. Вот краткий код, который я скопировал из учебника:

import logging

# create logger
logger = logging.getLogger("logging_tryout2")
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s")

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

# "application" code
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")

И вот вывод:

2010-07-10 10:46:28,811;DEBUG;debug message
2010-07-10 10:46:28,812;INFO;info message
2010-07-10 10:46:28,812;WARNING;warn message
2010-07-10 10:46:28,812;ERROR;error message
2010-07-10 10:46:28,813;CRITICAL;critical message

Я хотел бы сократить формат времени до просто: ' 2010-07-10 10:46:28', отбрасывая миллисекундный суффикс. Я посмотрел на Formatter.formatTime, но растерялся. Я ценю вашу помощь в достижении моей цели. Спасибо.

Хай вю
источник

Ответы:

224

Из официальной документации относительно класса Formatter:

Конструктор принимает два необязательных аргумента: строку формата сообщения и строку формата даты.

Так что меняй

# create formatter
formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s")

в

# create formatter
formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s",
                              "%Y-%m-%d %H:%M:%S")
Metalshark
источник
24
Обратите внимание, что если вы используете метод dictConfig для настройки ведения журнала (например, если вы используете Django), вы можете установить его, используя ключ dict 'datefmt' для средства форматирования. Смотрите: Конфигурация Django Logging , модуль регистрации: Детали схемы словаря
taleinat
8
Кроме того, если вы настраиваете протоколирование с помощью basicConfig, он принимает именованный параметр с именем datefmt
Bruno Lopes
10
В 1.9, если вы используете настройку LOGGING, вы можете включить запись 'datefmt', как эта ...'formatters': { 'default': { 'format': '%(asctime)s | %(levelname)s | %(module)s | %(message)s', 'datefmt': '%Y-%m-%d %H:%M', },
jcfollower
какой будет часовой пояс?
Luv33preet
@ Luv33preet его '% г'
shrmn
139

Используя logging.basicConfig, следующий пример работает для меня:

logging.basicConfig(
    filename='HISTORYlistener.log',
    level=logging.DEBUG,
    format='%(asctime)s.%(msecs)03d %(levelname)s %(module)s - %(funcName)s: %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S',
)

Это позволяет вам форматировать и конфигурировать все в одной строке. Результирующая запись в журнале выглядит следующим образом:

2014-05-26 12:22:52.376 CRITICAL historylistener - main: History log failed to start
Бен
источник
4
Я добавил форматирование с нулями для поля msecs. В противном случае значения msecs меньше 100 отображаются неправильно.
Нечетное
2
Тем не менее, ОП не хочет, чтобы msecs появлялся вообще!
Нечетное
31

если используется logging.config.fileConfig с файлом конфигурации, используйте что-то вроде:

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S
cripton
источник
29

Чтобы добавить к другим ответам, вот список переменных из документации Python.

Directive   Meaning Notes

%a  Locales abbreviated weekday name.   
%A  Locales full weekday name.  
%b  Locales abbreviated month name.     
%B  Locales full month name.    
%c  Locales appropriate date and time representation.   
%d  Day of the month as a decimal number [01,31].    
%H  Hour (24-hour clock) as a decimal number [00,23].    
%I  Hour (12-hour clock) as a decimal number [01,12].    
%j  Day of the year as a decimal number [001,366].   
%m  Month as a decimal number [01,12].   
%M  Minute as a decimal number [00,59].  
%p  Locales equivalent of either AM or PM. (1)
%S  Second as a decimal number [00,61]. (2)
%U  Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0.    (3)
%w  Weekday as a decimal number [0(Sunday),6].   
%W  Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0.    (3)
%x  Locales appropriate date representation.    
%X  Locales appropriate time representation.    
%y  Year without century as a decimal number [00,99].    
%Y  Year with century as a decimal number.   
%z  Time zone offset indicating a positive or negative time difference from UTC/GMT of the form +HHMM or -HHMM, where H represents decimal hour digits and M represents decimal minute digits [-23:59, +23:59].  
%Z  Time zone name (no characters if no time zone exists).   
%%  A literal '%' character.     
Иакх
источник