繁体   English   中英

Python 记录日志级别的等长字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM