Python logging.Formatter():有没有办法修复字段的宽度并左右对齐?

时间:2013-12-16 18:53:25

标签: python logging formatting

以下是日志记录教程中的日志记录示例:

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。

编辑:使用其他方法进行第二次尝试:

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!

也许我只是做了一些蠢事。

1 个答案:

答案 0 :(得分:26)

可以通过在类型说明符前添加数字来指定字段宽度:

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

您可以在传递给格式化程序的格式字符串中使用它。对于你的例子,那就是:

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