[python] 在多线程中将`logging.info`输出到不同的文件中 (生产者消费者)

在多线程中将logging.info输出到不同的文件中,可以使用Python标准库中的Queue和Thread模块。具体实现步骤如下:

  1. 创建多个Queue队列用于不同线程的日志输出,每个队列对应一个日志文件。
python 复制代码
import queue

# 创建三个队列用于不同线程的日志输出
log_q1 = queue.Queue()
log_q2 = queue.Queue()
log_q3 = queue.Queue()
  1. 创建多个Handler对象,分别处理不同的队列,并设置不同的输出格式和日志级别。
python 复制代码
import logging

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

# 定义输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# 创建三个handler,分别处理不同的队列
handler1 = logging.FileHandler("log1.txt")
handler1.setFormatter(formatter)
handler1.setLevel(logging.ERROR)
handler1.setStream(log_q1)

handler2 = logging.FileHandler("log2.txt")
handler2.setFormatter(formatter)
handler2.setLevel(logging.WARNING)
handler2.setStream(log_q2)

handler3 = logging.FileHandler("log3.txt")
handler3.setFormatter(formatter)
handler3.setLevel(logging.INFO)
handler3.setStream(log_q3)

# 将三个handler添加到logger中
logger.addHandler(handler1)
logger.addHandler(handler2)
logger.addHandler(handler3)
  1. 创建多个线程,在每个线程中从相应的队列中获取日志信息并输出到相应的文件中。
python 复制代码
import threading

def worker1():
    while True:
        try:
            record = log_q1.get()
            if record is None:
                break
            logger.handle(record)
        except Exception:
            pass

def worker2():
    while True:
        try:
            record = log_q2.get()
            if record is None:
                break
            logger.handle(record)
        except Exception:
            pass

def worker3():
    while True:
        try:
            record = log_q3.get()
            if record is None:
                break
            logger.handle(record)
        except Exception:
            pass

t1 = threading.Thread(target=worker1)
t1.start()

t2 = threading.Thread(target=worker2)
t2.start()

t3 = threading.Thread(target=worker3)
t3.start()
  1. 在主线程中使用logging.info等函数输出日志,将日志信息放入相应的队列中即可。
python 复制代码
# 在主线程中使用logging.info等函数输出日志,将日志信息放入相应的队列中
log_q1.put(logging.makeRecord("logger1", logging.ERROR, "test message", (), None, None, None))
log_q2.put(logging.makeRecord("logger2", logging.WARNING, "test message", (), None, None, None))
log_q3.put(logging.makeRecord("logger3", logging.INFO, "test message", (), None, None, None))

通过以上步骤,即可实现多线程中将logging.info输出到不同的文件中。需要注意的是,在使用Queue传递日志信息时,需要使用logging.makeRecord()方法创建LogRecord对象,并指定相应的logger名称、日志级别、消息内容等信息。

相关推荐
青少儿编程课堂1 小时前
蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析
c++·python·算法·bfs·信息学竞赛
tellmewhoisi1 小时前
nlp:知识库检索和dify知识库创建
python·自然语言处理
2601_968793141 小时前
Python Requests 轻量自动化:无需浏览器,实现真人级账号浏览模拟
开发语言·python·自动化
段一凡-华北理工大学11 小时前
工业智能体:从Codex/Claude到项目实战~系列文章05:从“AI助手“到“工业智能体“:能力跃迁与落地范式
人工智能·python·claude·codex·工业智能体·高炉炼铁智能化
深蓝AI11 小时前
ContextVar 到线程池就丢了?asyncio.to_thread 和 run_in_executor 实测
python
岁月宁静12 小时前
什么是 Agent:从"会聊天"到"会做事"
人工智能·python
岁月宁静12 小时前
AI 应用开发工程师简历怎么写:HR 初筛、技术复筛、面试追问,三道关卡各看什么?
人工智能·python·面试
来让爷抱一个13 小时前
Python 异步里混用同步库,事件循环被卡住的全过程
开发语言·python
小肝一下15 小时前
3.基础语法(3)
python
深蓝AI15 小时前
Python 子进程树:父进程被杀后,孙进程为何还在跑?
python