如何在Python帮助信息中使用logging模块且不输出__main__.INFO标识
如何在Python帮助信息中使用logging模块且不输出__main__.INFO标识
我来给你几个简单实用的方案,彻底解决这个问题,不用再手动添加/移除Handler这么麻烦啦!
方案一:临时切换控制台Handler的格式化器(最推荐)
这个方案复用你已经创建的控制台Handler,只是在输出帮助信息时临时替换成只显示消息内容的格式,输出完成后立刻恢复原格式,完全不影响后续日志输出。
修改你的代码如下:
import logging import sys # 别忘了导入sys获取命令行参数 def show_help(logger, con_handler): 'This is help messages' help_msg = '''\n The valid options:\n [-src_path : <option to provide src_path ] [-dest_path : <option to provide dest_path ] ''' # 保存原有的格式化器 original_formatter = con_handler.formatter # 设置仅输出消息内容的格式化器 con_handler.setFormatter(logging.Formatter('%(message)s')) # 用logger输出帮助信息 logger.info(help_msg) # 恢复原格式化器 con_handler.setFormatter(original_formatter) def define_logger(): log_path = "/usr/scripts/logs/my_script.log" # Create a custom logger logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # Create a console handler f_handler = logging.FileHandler(log_path) con_handler = logging.StreamHandler() con_handler.setLevel(logging.DEBUG) # Create a formatter and add it to the handler con_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s') con_handler.setFormatter(con_format) f_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s') f_handler.setFormatter(f_format) # Add the handler to the logger logger.addHandler(con_handler) logger.addHandler(f_handler) return logger, con_handler if __name__ == '__main__': args = sys.argv # 定义args变量 logger, con_handler = define_logger() if len(args) > 1 and args[1] == '-help_msg': show_help(logger, con_handler) else: # 你的其他业务逻辑,比如正常日志输出 logger.info("脚本正常启动")
这个方案的优势是零额外开销,完全复用现有日志组件,不会对其他日志输出产生任何影响,还能按需把帮助信息同步写入日志文件。
方案二:创建专门的帮助信息Logger
如果希望帮助信息的日志和业务日志完全隔离,可以创建一个独立的Logger,专门用于输出无格式的帮助内容:
import logging import sys def get_help_logger(): # 创建独立的帮助日志器 help_logger = logging.getLogger('help_logger') help_logger.setLevel(logging.INFO) # 配置仅输出消息的控制台Handler handler = logging.StreamHandler() handler.setFormatter(logging.Formatter('%(message)s')) help_logger.addHandler(handler) # 禁止向父级日志器传播,避免被其他格式影响 help_logger.propagate = False return help_logger def show_help(): 'This is help messages' help_msg = '''\n The valid options:\n [-src_path : <option to provide src_path ] [-dest_path : <option to provide dest_path ] ''' help_logger = get_help_logger() help_logger.info(help_msg) # 剩下的define_logger和main函数保持不变 def define_logger(): log_path = "/usr/scripts/logs/my_script.log" logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) f_handler = logging.FileHandler(log_path) con_handler = logging.StreamHandler() con_handler.setLevel(logging.DEBUG) con_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s') con_handler.setFormatter(con_format) f_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s') f_handler.setFormatter(f_format) logger.addHandler(con_handler) logger.addHandler(f_handler) return logger, con_handler if __name__ == '__main__': args = sys.argv logger, con_handler = define_logger() if len(args) > 1 and args[1] == '-help_msg': show_help() else: logger.info("脚本正常启动")
这个方案适合比较复杂的项目,帮助信息的日志流程和业务日志完全分开,不会互相干扰。
为什么不推荐你原来的“移除Handler”方案?
你原来的做法是移除Handler再用print输出,存在两个明显问题:
- 操作繁琐,容易忘记恢复Handler,导致后续控制台日志直接失效;
- 无法按需将帮助信息同步写入日志文件,而用上面的方案可以轻松实现这个需求。
备注:内容来源于stack exchange,提问作者A.G.Progm.Enthusiast
相关产品推荐
相关产品推荐

