logging日志异步打印——不影响主流程(python)

部署运行你感兴趣的模型镜像

需求与解决方案

当日志打印量较大或频率较高时,为避免日志输出影响代码主流程执行,可采用异步方式实现日志记录。

示例代码

import logging
import logging.handlers
import queue

# 配置主日志记录器
root_logger = logging.getLogger()
root_logger.setLevel(logging.DEBUG)

# 创建队列
log_queue = queue.Queue()

# 创建队列处理器
queue_handler = logging.handlers.QueueHandler(log_queue)
root_logger.addHandler(queue_handler)

# 创建实际的日志处理器(如文件处理器)
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)

# 创建队列监听器
queue_listener = logging.handlers.QueueListener(log_queue, file_handler)
queue_listener.start()


def main():
    logger = logging.getLogger(__name__)
    for i in range(1000):
        logger.debug(f"Logging message {i}")


if __name__ == "__main__":
    try:
        main()
    finally:
        # 停止队列监听器
        queue_listener.stop()
    

基于 QueueHandler、FileHandler 和 QueueListener 的交互流程

初始化配置阶段

  1. 创建队列:构建queue.Queue对象,用于临时存储待处理的日志记录,后续日志消息皆存放于此。
  2. 配置队列处理器(QueueHandler):添加至主日志记录器,作用为拦截主日志记录器生成的所有日志记录,并将其存入之前创建的队列,类似 “调度员”。
  3. 配置文件处理器(FileHandler):创建FileHandler对象,负责将日志记录写入文件,可设置日志级别与格式,如指定日志文件路径、输出格式(时间、日志级别、日志消息等)。
  4. 配置队列监听器(QueueListener):创建QueueListener对象,传入队列与文件处理器。其在单独线程运行,持续监听队列,一旦队列中有新日志记录,就取出传递给文件处理器。

日志记录阶段

  1. 日志产生:代码中调用logger记录日志,如logger.debug("Some debug message"),主日志记录器生成日志记录。
  2. 日志入队:由于QueueHandler已添加到主日志记录器,该日志记录会被QueueHandler拦截并放入队列。此时主程序可继续执行,无需等待日志实际处理完成,避免影响主程序性能。

日志处理阶段

  1. 日志监听与传递QueueListener在单独线程持续监听队列,一旦发现新日志记录,立即从队列中取出。
  2. 日志写入文件QueueListener将取出的日志记录传递给FileHandlerFileHandler按配置的日志级别与格式,将日志记录写入指定文件。

程序结束阶段

调用QueueListenerstop方法,确保队列中剩余日志记录处理完毕,停止监听队列,释放相关资源。

总结:QueueHandler负责将日志记录放入队列,QueueListener负责从队列取出日志记录传递给FileHandlerFileHandler负责将日志记录写入文件,三者协同实现异步日志记录功能

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值