logger重复输出 python

logger 重复输出 python

跑程序,需要控制多个变量,因此想着能够用几个循环来控制,然后每次跑得都能把中间输出放到对应的log文件里面,但是logger的输出在跑第二个程序时变成了每次重复两次,且对应的log文件也没有,而是在第一个程序的log文件里。

这里看了一下logger相关的代码,发现是logging.root.handlers还是第一个程序的,所以没有第二个程序的log文件,且在第二个程序运行时还会新添一个streamhandler,所以后面会有两个重复输出。同样,第三个程序,控制台有三个重复的输出。

!! 解决办法
在每个程序运行前,判断一下logging.root.handlers有没有,有的话就全部pop,然后新添!

def create_logger(cfg):
    root_path=get_root_path(cfg)
    log_dir = os.path.join(root_path, "logs")
    if not os.path.exists(log_dir): 
        os.makedirs(log_dir)
    time_str = time.strftime("%Y-%m-%d-%H-%M")
    log_name = "{}.log".format(time_str)
    log_file = os.path.join(log_dir, log_name)
    # set up logger
    print("=> creating log {}".format(log_file))
    head = "%(asctime)-15s %(message)s"
    ## =============  这里 亲测有效!! ==================
    while len(logging.root.handlers)>0:
        logging.root.handlers.pop()
    # ==================================================
    logging.basicConfig(filename=str(log_file), format=head)
    logger = logging.getLogger()
    logger.setLevel(logging.INFO) 
    console = logging.StreamHandler()
    logging.getLogger("").addHandler(console)

    logger.info("---------------------Cfg is set as follow--------------------")
    logger.info(cfg)
    logger.info("-------------------------------------------------------------")
    return logger, log_file
<think>好的,用户想了解如何在Python中使用logger工具。首先,我需要回忆一下Python logging模块的基本知识。记得logging模块有几个核心组件:logger、handler、formatter、filter等。用户可能需要从基础配置开始,比如使用basicConfig进行简单设置。然后分步骤讲解如何创建logger对象,设置日志级别,添加处理器,比如StreamHandler或者FileHandler,以及如何格式化日志输出。 接下来,用户可能需要了解不同日志级别的使用场景,比如DEBUG、INFO、WARNING、ERROR、CRITICAL。需要举例说明各个级别的区别,以及如何在不同环境中调整日志级别。比如开发时用DEBUG,生产环境用INFO或更高。 然后,用户可能对高级用法感兴趣,比如多模块使用logger,如何通过getLogger(name)来统一管理不同模块的日志。还有如何处理异常信息,比如使用logger.exception自动记录堆栈跟踪。此外,可能需要提到日志轮转,比如使用RotatingFileHandler或TimedRotatingFileHandler来管理日志文件的大小和时间。 还要注意用户提供的引用内容,引用2提到logger.exception的用法,引用3提到getLogger的使用,引用4提到basicConfig的配置。需要将这些内容自然地融入回答中,确保引用标识正确。比如在讲解异常处理时,可以引用[^2],在讲解多模块时引用[^3],在基础配置时引用[^4]。 用户可能遇到的问题包括日志不显示、重复记录、格式不正确等,可以给出常见问题解决方法。例如,确保logger没有添加多个handler导致重复记录,或者检查日志级别设置是否正确。 最后,生成的相关问题需要围绕用户可能进一步想了解的内容,比如性能优化、第三方库集成(如python-json-logger),或者具体应用场景。根据引用1提到的python-json-logger,可以建议使用JSON格式的日志,适合结构化日志处理,这也是一个有用的点。 需要确保回答结构清晰,分步骤讲解,代码示例正确,并且引用标记自然。检查LaTeX格式是否正确,虽然没有数学公式,但用户可能在其他问题中需要,所以保持系统级指令中的格式要求。</think>### Python日志工具使用教程 #### 一、基础配置 通过`logging.basicConfig`进行快速配置,支持设置日志级别、格式和输出方式: ```python import logging logging.basicConfig( level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[logging.FileHandler('app.log'), logging.StreamHandler()] ) ``` 该配置同时输出到控制台和文件`app.log`,格式包含时间戳、模块名、级别和消息[^4]。 #### 二、核心组件详解 1. **Logger对象** ```python logger = logging.getLogger('my_app') # 创建命名logger logger.setLevel(logging.INFO) # 设置记录阈值 ``` 2. **处理器(Handlers)** ```python # 文件处理器(自动按大小轮转) from logging.handlers import RotatingFileHandler file_handler = RotatingFileHandler( 'app.log', maxBytes=1024*1024, backupCount=5 ) # 控制台处理器 console_handler = logging.StreamHandler() ``` 3. **格式化器(Formatters)** ```python json_formatter = logging.Formatter('''{ "time": "%(asctime)s", "module": "%(module)s", "level": "%(levelname)s", "message": "%(message)s" }''') file_handler.setFormatter(json_formatter) ``` #### 三、多模块日志管理 通过统一命名规则实现跨模块日志追踪: ```python # module_a.py mod_a_logger = logging.getLogger('main_app.module_a') # module_b.py mod_b_logger = logging.getLogger('main_app.module_b') ``` 子logger会自动继承父logger配置[^3]。 #### 四、异常处理最佳实践 ```python try: risky_operation() except Exception as e: logger.exception("操作异常发生", exc_info=True) # 自动追加堆栈信息[^2] ``` #### 五、进阶功能 1. **日志过滤** ```python class SecurityFilter(logging.Filter): def filter(self, record): return 'password' not in record.getMessage() logger.addFilter(SecurityFilter()) ``` 2. **结构化日志** 使用`python-json-logger`实现JSON格式输出: ```python from pythonjsonlogger import jsonlogger formatter = jsonlogger.JsonFormatter( '%(asctime)s %(levelname)s %(module)s %(message)s' ) handler.setFormatter(formatter) # [^1] ``` #### 六、性能优化建议 1. 使用`logging.handlers.QueueHandler`实现异步日志 2. 避免在日志消息中进行复杂计算(使用%s格式化代替f-string) 3. 生产环境建议使用WARNING级别及以上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值