Python2.7标准logging库如何获取所有当前可用日志级别?
获取Python 2.7 logging所有日志级别(含自定义)并同步到argparse
嘿,刚好碰到过类似需求,给你整理个靠谱的解决方案!Python 2.7的logging库确实没有直接的getLevels()方法,但我们可以通过模块内部的映射字典来轻松获取所有注册的日志级别(包括你自定义的),然后直接同步到argparse的参数选项里。
核心思路
logging模块在Python2.7里维护了一个logging._levelNames字典,它会自动记录所有注册过的日志级别(包括默认的和你自定义的),键值对同时包含“级别数值→名称”和“名称→级别数值”的双向映射。我们只需要从中提取出所有级别名称即可。
完整代码示例
import argparse import logging # 先定义你的自定义日志级别(示例) # 比如新增一个VERBOSE级别,数值介于DEBUG和INFO之间 logging.addLevelName(15, 'VERBOSE') logging.VERBOSE = 15 def get_all_log_level_names(): """获取所有可用的日志级别名称(含自定义)""" log_level_names = [] # 遍历_levelNames,筛选出字符串类型的键(也就是级别名称) for key in logging._levelNames: if isinstance(key, basestring): log_level_names.append(key) # 按级别数值从小到大排序,让选项顺序更合理 return sorted(log_level_names, key=lambda name: logging._levelNames[name]) # 初始化argparse parser = argparse.ArgumentParser('our app') available_log_levels = get_all_log_level_names() parser.add_argument( '-l', '--loglevel', type=str, choices=available_log_levels, default='INFO', help='Log level to use. Available levels: {}'.format(', '.join(available_log_levels)) ) # 解析参数并设置日志级别 args = parser.parse_args() logging.basicConfig(level=getattr(logging, args.loglevel)) # 测试输出 logging.debug('这是DEBUG级别的日志') logging.log(logging.VERBOSE, '这是自定义的VERBOSE级别日志') logging.info('这是INFO级别的日志') logging.warning('这是WARNING级别的日志')
关键细节说明
- 自定义级别的正确姿势:必须用
logging.addLevelName()注册级别名称,同时给logging模块添加对应的属性(比如logging.VERBOSE=15),这样自定义级别才会被_levelNames收录,并且能像默认级别一样使用。 - 自动同步到argparse:把获取到的级别列表传给
add_argument()的choices参数,这样用户输入非法级别时,argparse会自动提示所有可选值,不用手动维护选项列表。 - 排序优化:通过级别数值排序后,选项顺序会是
NOTSET, DEBUG, VERBOSE, INFO, WARNING, ERROR, CRITICAL,符合日志级别从低到高的逻辑。
效果演示
当用户输入错误的级别时,会得到清晰的提示:
usage: our app [-h] [-l {NOTSET,DEBUG,VERBOSE,INFO,WARNING,ERROR,CRITICAL}] our app: error: argument -l/--loglevel: invalid choice: 'TEST' (choose from 'NOTSET', 'DEBUG', 'VERBOSE', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
内容的提问来源于stack exchange,提问作者Ultimation
相关产品推荐
相关产品推荐

