Подтвердить что ты не робот

Python logging.Formatter(): есть ли способ исправить ширину поля и оправдать его влево/вправо?

Здесь приведен пример записей журнала из учебника по протоколированию:

2005-03-19 15:38:55,977 - simpleExample - DEBUG - debug message
2005-03-19 15:38:55,979 - simpleExample - INFO - info message
2005-03-19 15:38:56,054 - simpleExample - WARNING - warn message
2005-03-19 15:38:56,055 - simpleExample - ERROR - error message
2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message

Эта конечная зубчатость раздражает меня до конца.

Я действительно хочу иметь возможность форматировать вот так:

2005-03-19 15:38:55,977 - simpleExample -    DEBUG - debug message
2005-03-19 15:38:55,979 - simpleExample -     INFO - info message
2005-03-19 15:38:56,054 - simpleExample -  WARNING - warn message
2005-03-19 15:38:56,055 - simpleExample -    ERROR - error message
2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message

Я попытался выполнить следующие действия для моего регистратора, который не работает (сокращенный код):

fmt = "{0:>8}"
formatter = logging.Formatter("%(asctime)s %(filename)s: " + fmt.format("%(levelname)s") + " %(message)s", "%Y/%m/%d %H:%M:%S")

Выполняет штраф и печатает имя уровня, как всегда, но не использует формат ширины.

Исх.

logger.debug("testing debug message")
logger.info("some random info")
logger.critical("oh crap!")

Фактический результат:

2013/12/16 13:43:10 logtester: DEBUG testing debug message
2013/12/16 13:43:10 logtester: INFO some random info
2013/12/16 13:43:10 logtester: CRITICAL oh crap!

Желаемый результат:

2013/12/16 13:43:10 logtester:    DEBUG testing debug message
2013/12/16 13:43:10 logtester:     INFO some random info
2013/12/16 13:43:10 logtester: CRITICAL oh crap!

Любые подсказки для реализации фиксированной ширины поля в logging.Formatter()?

Использование Python 2.6.9.

EDIT: вторая попытка с использованием другого метода:

formatter = logging.Formatter("%(asctime)s %(filename)s: " + "%(foo)5s" % {"foo" : "(%(levelname)s)"} + " %(message)s", "%Y/%m/%d %H:%M:%S")

Все еще приводит к:

2013/12/16 13:43:10 logtester: DEBUG testing debug message
2013/12/16 13:43:10 logtester: INFO some random info
2013/12/16 13:43:10 logtester: CRITICAL oh crap!

Может быть, я просто делаю что-то пронзительное.

4b9b3361

Ответ 1

Ширина поля может быть задана путем добавления номера перед спецификатором типа:

>>> "%(foo)8s" % {'foo': 'bar'}
'     bar'

Вы можете использовать это в строке формата, переданной в форматтер. Для вашего примера это будет:

"%(asctime)s %(filename)s: %(levelname)8s %(message)s"