欢迎访问宙启技术站
智能推送

使用get_logger()实现Python中多线程和多进程日志记录

发布时间:2024-01-05 21:02:35

在Python中,使用logging模块来记录日志是非常常见和方便的。为了在多线程和多进程环境中正确地记录日志,我们需要使用get_logger()方法创建和获取logger对象,并且使用锁机制对日志进行同步处理。下面是一个使用get_logger()实现多线程和多进程日志记录的例子:

import logging
import threading
import multiprocessing

# 创建一个logger对象
logger = logging.getLogger()

# 创建一个文件处理器,用于将日志写入文件
file_handler = logging.FileHandler("log.txt")

# 创建一个格式化器,用于设置日志格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

# 将格式化器添加到文件处理器中
file_handler.setFormatter(formatter)

# 将文件处理器添加到logger对象中
logger.addHandler(file_handler)

# 设置日志级别
logger.setLevel(logging.INFO)

def worker():
    # 获取当前线程的logger对象
    local_logger = logging.getLogger()
    
    # 打印当前线程的名称
    local_logger.info("Thread %s starting..." % threading.current_thread().name)
    
    # 模拟工作
    for i in range(5):
        local_logger.info("Working...")
        
    # 打印当前线程的名称
    local_logger.info("Thread %s exiting..." % threading.current_thread().name)

def main():
    # 创建5个线程
    threads = []
    for i in range(5):
        t = threading.Thread(target=worker)
        threads.append(t)
        t.start()

    # 等待所有线程完成
    for t in threads:
        t.join()

if __name__ == '__main__':
    # 获取主进程的logger对象
    mp_logger = logging.getLogger()

    # 打印主进程的名称
    mp_logger.info("Main process starting...")

    # 创建10个子进程
    processes = []
    for i in range(10):
        p = multiprocessing.Process(target=main)
        processes.append(p)
        p.start()

    # 等待所有子进程完成
    for p in processes:
        p.join()

    # 打印主进程的名称
    mp_logger.info("Main process exiting...")

在上面的例子中,我们首先创建了一个全局的logger对象。然后,我们创建了一个文件处理器,并将其添加到logger对象中。我们还设置了一个日志格式化器,并将其添加到文件处理器中。最后,我们设置了日志级别为INFO,这意味着只有INFO级别的日志会被记录。

在worker函数中,我们首先通过logging.getLogger()方法获取当前线程的logger对象。然后,我们使用logger对象记录一些日志消息,包括线程的名称和工作状态。

在main函数中,我们创建了5个线程,并给每个线程分配一个worker函数来执行。我们使用logger对象记录主进程的名称和状态,并且在每个线程中使用局部的logger对象记录线程的名称和状态。最后,我们等待所有线程完成。

在__main__中,我们首先获取主进程的logger对象,并使用它记录主进程的名称和状态。然后,我们创建了10个子进程,并给每个子进程分配一个main函数来执行。我们使用主进程的logger对象记录子进程的名称和状态。最后,我们等待所有子进程完成。

通过以上的实现,我们可以在多线程和多进程环境中正确记录日志。由于每个线程和进程都拥有自己的logger对象,因此它们可以独立地记录日志,而不会相互干扰。同时,通过使用锁机制,我们可以保证在多线程和多进程环境中对日志的同步处理。