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

Cpt*_*rkt 20 python formatting logging

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

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
Run Code Online (Sandbox Code Playgroud)

这种拖尾的锯齿状让我感到厌烦.

我真的希望能够像这样格式化:

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
Run Code Online (Sandbox Code Playgroud)

我为我的记录器尝试了以下操作,但它不起作用(缩写代码):

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

这样可以正常执行并始终打印级别名称,但它不实现宽度格式.

防爆.

logger.debug("testing debug message")
logger.info("some random info")
logger.critical("oh crap!")
Run Code Online (Sandbox Code Playgroud)

实际结果:

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!
Run Code Online (Sandbox Code Playgroud)

期望的结果:

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!
Run Code Online (Sandbox Code Playgroud)

在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")
Run Code Online (Sandbox Code Playgroud)

仍然导致:

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!
Run Code Online (Sandbox Code Playgroud)

也许我只是在做一些愚蠢的事情.

Amb*_*ber 28

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

>>> "%(foo)8s" % {'foo': 'bar'}
'     bar'
Run Code Online (Sandbox Code Playgroud)

您可以在传递给formatter的格式字符串中使用它.对于你的例子,那是:

"%(asctime)s %(filename)s: %(levelname)8s %(message)s"
Run Code Online (Sandbox Code Playgroud)

  • 您不应该自己执行格式操作 - 只需在您传递的字符串中使用字段宽度语法。例如`%(levelname)8s`。 (2认同)

Mil*_*vis 14

日志记录(从 3.2 开始)提供了对括号字符串格式样式的改进支持。例如,您现在可以使用这种格式:

fomatter = logging.Formatter('{asctime} {name} {levelname:^8s} {message}', style='{')
Run Code Online (Sandbox Code Playgroud)

它产生中心对齐的日志级别。我不认为这对于 % 格式的字符串是可能的。

2021-10-19 14:27:05,799 __main__  DEBUG   Debug message
2021-10-19 14:27:05,800 __main__   INFO   Info message
2021-10-19 14:27:05,800 __main__ WARNING  Warning message
2021-10-19 14:27:05,801 __main__  ERROR   Error message
Run Code Online (Sandbox Code Playgroud)

和

'{asctime} {name} {levelname:<8s} {message}' 右对齐

2021-10-19 14:26:45,408 __main__    DEBUG Debug message
2021-10-19 14:26:45,409 __main__     INFO Info message
2021-10-19 14:26:45,410 __main__  WARNING Warning message
2021-10-19 14:26:45,410 __main__    ERROR Error message

Run Code Online (Sandbox Code Playgroud)

或者

'{asctime} {name} {levelname:>8s} {message}' 左对齐

2021-10-19 14:26:25,761 __main__ DEBUG    Debug message
2021-10-19 14:26:25,761 __main__ INFO     Info message
2021-10-19 14:26:25,762 __main__ WARNING  Warning message
2021-10-19 14:26:25,762 __main__ ERROR    Error message
Run Code Online (Sandbox Code Playgroud)