You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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输出,存在两个明显问题:

  1. 操作繁琐,容易忘记恢复Handler,导致后续控制台日志直接失效;
  2. 无法按需将帮助信息同步写入日志文件,而用上面的方案可以轻松实现这个需求。

备注:内容来源于stack exchange,提问作者A.G.Progm.Enthusiast

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 03:19:59