当前位置:   article > 正文

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

python logger多线程

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

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

# 创建三个队列用于不同线程的日志输出
log_q1 = queue.Queue()
log_q2 = queue.Queue()
log_q3 = queue.Queue()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
'
运行
  1. 创建多个Handler对象,分别处理不同的队列,并设置不同的输出格式和日志级别。
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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  1. 创建多个线程,在每个线程中从相应的队列中获取日志信息并输出到相应的文件中。
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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  1. 在主线程中使用logging.info等函数输出日志,将日志信息放入相应的队列中即可。
# 在主线程中使用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))
  • 1
  • 2
  • 3
  • 4

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

log_lock = threading.Lock()
_log_dict = dict()

def log(msg):
    msg = str(msg)
    with log_lock:
        thread_name = threading.currentThread().getName()
        if thread_name in _log_dict:
            logger = _log_dict[thread_name]
        else:
            logger = logging.getLogger(thread_name)
            logger.setLevel(logging.INFO)
            file_handler = logging.FileHandler(f'{thread_name}.log', mode='w', encoding='utf-8')
            formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
            file_handler.setFormatter(formatter)
            logger.addHandler(file_handler)
            _log_dict[thread_name] = logger
        logger.info(msg)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/963133
推荐阅读
相关标签
  

闽ICP备14008679号