如何在Python logging.Formatter中对齐level字段

ste*_*liu 33 python formatting logging

我目前正试图在我的Python记录器中正确对齐日志记录级别字段,以便输出如下:

[2011-10-14 13:47:51] [DEBUG] --- starting... (smtphandlers.py:96)
[2011-10-14 13:47:51] [INFO] --- first things first... (smtphandlers.py:97)
[2011-10-14 13:47:51] [WARNING] --- about to end... (smtphandlers.py:98)
[2011-10-14 13:47:51] [DEBUG] --- ending (smtphandlers.py:99)
Run Code Online (Sandbox Code Playgroud)

相反看起来像:

[2011-10-14 13:47:51] [   DEBUG] --- starting... (smtphandlers.py:96)
[2011-10-14 13:47:51] [    INFO] --- first things first... (smtphandlers.py:97)
[2011-10-14 13:47:51] [ WARNING] --- about to end... (smtphandlers.py:98)
[2011-10-14 13:47:51] [   DEBUG] --- ending (smtphandlers.py:99)
Run Code Online (Sandbox Code Playgroud)

第一个块的格式行是:

logging.Formatter("[%(asctime)s] [%(levelname)s] --- %(message)s (%(filename)s:%(lineno)s)", "%Y-%m-%d %H:%M:%S")
Run Code Online (Sandbox Code Playgroud)

如果我知道最大级别长度是8(例如:CRITICAL),那么我将右对齐8个空格.我正试图弄清楚如何实现这一目标.以下操作失败,因为"%(levelname)s"超过8个字符(替换直到稍后才会发生).如果我使用"{0:> 20}".格式化"%(levelname)s"之类的东西,那么它可以工作,但这比我需要或想要的填充更多.

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

没有子类化Formatter,任何人都有办法实现这一目标?

ret*_*ile 56

像这样:

logging.Formatter("[%(asctime)s] [%(levelname)8s] --- %(message)s (%(filename)s:%(lineno)s)", "%Y-%m-%d %H:%M:%S")
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要INFO左对齐,你可以使用`[%(levelname)-8s]` (24认同)
  • @AlexL 中心对齐怎么样? (3认同)
  • @JoeVictor 迟到了,但这可以通过将 Formatter 对象的“style”参数设置为“{”并执行类似“[{levelname:^8s}]”之类的操作来完成。 (2认同)

Céd*_*ien 8

尝试使用此格式行:

logging.Formatter("[%(asctime)s] [%(levelname)8s] --- %(message)s (%(filename)s:%(lineno)s)", "%Y-%m-%d %H:%M:%S")
Run Code Online (Sandbox Code Playgroud)

python记录器格式化程序使用标准的python字符串格式化规则