本文将从多个方面详细介绍Python多线程Logging,并给出完整的代码示例。
一、Logger对象介绍
Logger对象是Logging模块中最基本的对象。Logger对象用于发送消息到不同的输出位置(如控制台、文件等)。其初始化方法如下:
import logging logger = logging.getLogger('my_logger')
其中,“my_logger”是Logger对象的名称,可以自定义,也可以不填。
二、Handler对象介绍
Handler对象定义了消息被发送到的位置和方式。一个Logger对象可以有多个Handler对象,每个Handler对象可以将消息发送到不同的位置。
以将消息发送到控制台为例,其初始化方法如下:
console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) logger.addHandler(console_handler)
其中,console_handler是一个StreamHandler对象,可以将消息发送到标准输出。需要注意的是,必须设置控制台Handler对象的级别,否则它将不会收到任何消息。
三、Formatter对象介绍
Formatter对象定义了消息的输出格式,可以自定义消息的输出方式。
以将消息输出为“[%(levelname)s] %(asctime)s %(message)s”的形式为例,其初始化方法如下:
formatter = logging.Formatter('[%(levelname)s] %(asctime)s %(message)s') console_handler.setFormatter(formatter)
四、多线程Logging示例
下面是一个使用Python多线程Logging的完整示例,将消息同时输出到控制台和文件中:
import logging import threading logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) # 初始化控制台Handler对象 console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) formatter = logging.Formatter('[%(levelname)s] %(asctime)s %(message)s') console_handler.setFormatter(formatter) # 初始化文件Handler对象 file_handler = logging.FileHandler('log.txt') file_handler.setLevel(logging.DEBUG) file_formatter = logging.Formatter('[%(levelname)s] %(asctime)s %(message)s') file_handler.setFormatter(file_formatter) logger.addHandler(console_handler) logger.addHandler(file_handler) def worker(): logger.info('Starting') # do some work logger.info('Finished') for i in range(5): t = threading.Thread(target=worker) t.start() # 等待所有线程执行完毕 for t in threading.enumerate(): if t != threading.current_thread(): t.join()
上述代码中,使用了两个Handler对象,分别输出到控制台和文件中。同时,使用了多线程来模拟多个同时运行的任务,在任务的开始和结束时输出日志信息。需要注意的是,如果希望将日志信息同时输出到多个位置,需要将多个Handler对象添加到同一个Logger对象中。