Python使用logging模块时如何实现日志级别字符串等宽对齐输出
方案1:直接使用格式化字符串固定宽度对齐(无侵入,推荐)
这个方案不需要修改默认的日志级别名称,仅通过调整Formatter的格式配置就能实现对齐,Python 3.2及以上版本支持style参数使用str.format语法,可轻松实现居中、左对齐、右对齐效果。
示例代码:
import logging # 配置日志,使用{风格的格式,指定levelname固定占8位,居中对齐 logging.basicConfig( level=logging.DEBUG, format="[{levelname:^8s}] - {message}", style="{" ) # 测试输出 logging.debug("Message") logging.info("Message") logging.warning("Message") logging.error("Message") logging.critical("Message")
输出效果:
[ DEBUG ] - Message [ INFO ] - Message [ WARNING ] - Message [ ERROR ] - Message [CRITICAL] - Message
如果习惯用传统%风格的格式化,可以用%(levelname)8s实现右对齐,%-8s实现左对齐,示例:
# %风格右对齐配置 logging.basicConfig( level=logging.DEBUG, format="[%(levelname)8s] - %(message)s" )
方案2:自定义缩写日志级别名称
如果需要和你示例里的短名称效果一致,可以修改默认的日志级别显示名称,再配合固定宽度格式即可:
import logging # 重定义各日志级别的显示名称 logging.addLevelName(logging.DEBUG, "DBUG") logging.addLevelName(logging.INFO, "INFO") logging.addLevelName(logging.WARNING, "WARN") logging.addLevelName(logging.ERROR, "EROR") # CRITICAL保持原名称长度,也可以缩写为CRIT等按需调整 logging.addLevelName(logging.CRITICAL, "CRITICAL") # 配置格式,固定8位居中对齐 logging.basicConfig( level=logging.DEBUG, format="[{levelname:^8s}] - {message}", style="{" ) # 测试输出 logging.debug("Message") logging.info("Message") logging.warning("Message") logging.error("Message") logging.critical("Message")
输出效果和你给出的示例完全一致:
[ DBUG ] - Message [ INFO ] - Message [ WARN ] - Message [ EROR ] - Message [CRITICAL] - Message
方案3:自定义Formatter类(高灵活度)
如果需要更复杂的处理逻辑,比如不同级别自定义不同的缩写规则、对齐逻辑,可以继承logging.Formatter重写format方法,该方案不会全局修改日志级别名称,适合多日志实例的场景:
import logging class AlignLevelFormatter(logging.Formatter): def format(self, record): # 自定义levelname处理逻辑 level_map = { logging.DEBUG: "DBUG", logging.INFO: "INFO", logging.WARNING: "WARN", logging.ERROR: "EROR", logging.CRITICAL: "CRITICAL" } record.levelname = level_map.get(record.levelno, record.levelname) # 调用父类方法完成剩余格式化 return super().format(record) # 配置日志 logger = logging.getLogger() logger.setLevel(logging.DEBUG) handler = logging.StreamHandler() # 使用自定义Formatter formatter = AlignLevelFormatter("[{levelname:^8s}] - {message}", style="{") handler.setFormatter(formatter) logger.addHandler(handler) # 测试 logger.debug("Message")
内容的提问来源于stack exchange,提问作者WatsonBoi
相关产品推荐
相关产品推荐

