[英]Python Logging Equal Length String of Log Level
在使用python中的logging
模块时,显示logging level使得它们的长度都不一样。 使用格式字符串"[%(levelname)s] - %(message)s"
,日志文件如下所示:
[DEBUG] - Message
[INFO] - Message
[WARNING] - Message
[ERROR] - Message
[CRITICAL] - Message
但是,如果日志级别占用相同数量的空间,我真的很喜欢。 有没有办法让 output 看起来像这样:
[ DBUG ] - Message
[ INFO ] - Message
[ WARN ] - Message
[ EROR ] - Message
[CRITICAL] - Message
这是否需要缩短级别名称,或者只是在名称的两侧添加填充对我来说并不重要。 我所追求的只是某种让所有东西都在关卡名称之后排列的方法。
如果您事先知道最长的日志级别名称,例如,如果您只打算使用标准日志级别,一个简单的解决方案可能是设置格式化程序,如下面的第一个代码块(输出与灵活解决方案相同) :
# Set logging format and lowest logging level
logging.basicConfig(format='[{levelname:^8s}] - {message:s}',
style='{',
level=logging.DEBUG)
for i,nm in logging._levelToName.items():
logging.log(i, f"This is a {nm.lower().strip()} level message")
如果事先不知道日志级别的名称,一种灵活的解决方案是重命名logging
模块的数字日志级别。 该解决方案在下面的代码中演示。
该代码设置了一个基本格式化程序来复制请求的 output 消息,并将日志记录级别设置为最低级别。
在确定最长的日志级别名称后,它将所有日志级别名称设置为其原始名称,居中,并带有额外的填充。
# Set logging format and lowest logging level
logging.basicConfig(format='[%(levelname)s] - %(message)s',
level=logging.DEBUG)
# Determine longest loggging name
longest = max(logging._levelToName.items(), key=lambda x: len(x[1]))
maxLen = len(longest[1].strip())
# Reformat logging level names
for i,nm in logging._levelToName.items():
# See https://stackoverflow.com/a/69630856/5660315
logging.addLevelName(i, "{0:^{width}}".format(nm, width=maxLen))
logging.log(i, f"This is a {nm.lower().strip()} level message")
Output:
[CRITICAL] - This is a critical level message
[ ERROR ] - This is a error level message
[WARNING ] - This is a warning level message
[ INFO ] - This is a info level message
[ DEBUG ] - This is a debug level message
作为一个从未编写过 python 的开发人员,我设法做到了这一点。 它像你想要的那样工作
def labelize(label, max_len, message):
fixed = "["
len_to_cut = len(label) - 1 if len(label) % 2 == 1 else len(label)
for i in range(int((max_len - len_to_cut) / 2)):
fixed += " "
fixed += (label[0:len_to_cut])
for i in range(int((max_len - len_to_cut) / 2)):
fixed += " "
return fixed + "] " + message
print(labelize("DEBUG", 10, "Message"))
print(labelize("INFO", 10, "Message"))
print(labelize("WARNING", 10, "Message"))
print(labelize("ERROR", 10, "Message"))
print(labelize("CRITICAL", 10, "Message"))
[ DEBU ] Message
[ INFO ] Message
[ WARNIN ] Message
[ ERRO ] Message
[ CRITICAL ] Message
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.