如何在Python logging.Formatter中右对齐级别字段

66 投票
2 回答
30718 浏览
提问于 2025-04-17 04:20

我现在想把我的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)

而不是现在的样子:

[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)

第一个代码块的格式行是:

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

如果我知道最大的级别长度是8(比如:CRITICAL),那么我就想把它右对齐到8个空格。我正在想办法实现这个效果。下面的做法不行,因为“%(levelname)s”这个部分的字符数超过了8(替换是在后面进行的)。如果我使用像“{0:>20}.format"%(levelname)s"这样的方式,那就可以实现,但这会多出我不需要的空格。

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

除了创建一个Formatter的子类,还有没有其他方法可以做到这一点呢?

2 个回答

16

试试这个格式的代码行:

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

Python的日志记录器格式化器使用的是标准的Python 字符串格式化规则

120

像这样:

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

附注:如果你想让信息左对齐,可以使用 [%(levelname)-8s] 这个格式。

撰写回答