Closed Zacharia2 closed 8 months ago
如果你使用Python的logging
模块,并且不希望即时打印到控制台,你可以自定义一个日志处理器(Handler),将日志消息收集到一个列表中,然后通过一个函数来遍历并打印这些消息。
下面是一个示例,展示了如何实现这个功能:
import logging
# 创建一个logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG) # 设置日志级别
# 使用一个列表来收集日志消息
log_messages = []
# 自定义一个日志处理器,将日志消息添加到列表中
class LogCollectorHandler(logging.Handler):
def emit(self, record):
log_messages.append(self.format(record))
# 创建并添加自定义处理器到logger
collector_handler = LogCollectorHandler()
collector_handler.setLevel(logging.DEBUG)
logger.addHandler(collector_handler)
# 定义一个函数,用于稍后打印日志
def print_log_messages():
for message in log_messages:
print(message)
# 记录一些日志
logger.debug('这是一个debug信息')
logger.info('这是一个info信息')
logger.warning('这是一个warning信息')
logger.error('这是一个error信息')
logger.critical('这是一个critical信息')
# 调用函数打印日志
print_log_messages()
在这个例子中,我们定义了一个自定义处理器LogCollectorHandler
,它继承自logging.Handler
。这个处理器的emit
方法将被调用以处理每条日志消息,我们将消息格式化后添加到一个列表中。
然后,我们创建了一个LogCollectorHandler
实例,并将其添加到logger中。这样,当logger记录日志时,自定义处理器的emit
方法将被调用,日志消息将被收集到列表中。
最后,我们定义了一个print_log_messages
函数,它遍历收集到的日志消息并打印它们。你可以在任何需要的时候调用这个函数来输出日志。
这种方法的好处是,它允许你在记录日志和实际打印日志之间有一个延迟,这样你可以控制日志输出的时机。同时,它也保持了使用logging
模块的其他好处,比如日志级别的控制。
在程序执行期间收集日志信息,然后在程序的最后统一输出 py logging
如果你想要在程序执行期间收集日志信息,然后在程序的最后统一输出,你可以使用logging
模块的BufferingFormatter
类来缓存日志消息,并在需要时一次性输出所有缓存的消息。下面是一个简单的例子:
import logging
from logging.handlers import BufferingHandler
class CollectingHandler(BufferingHandler):
def __init__(self, capacity):
super(CollectingHandler, self).__init__(capacity)
def shouldFlush(self, record):
# 不立即刷新,只在手动调用flush()时输出
return False
def emit(self, record):
# 实现父类的emit方法,将记录存储到内部的缓冲区
super(CollectingHandler, self).emit(record)
def output_collected_logs(handler):
# 获取缓存的日志消息并输出
for record in handler.buffer:
print(handler.format(record))
# 创建一个收集日志的处理器
collecting_handler = CollectingHandler(capacity=100)
# 配置日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
collecting_handler.setFormatter(formatter)
# 创建一个日志记录器,并添加收集日志的处理器
logger = logging.getLogger('my_logger')
logger.setLevel(logging.INFO)
logger.addHandler(collecting_handler)
# 程序的其他部分,记录日志
logger.info("这是第一条日志信息。")
logger.info("这是第二条日志信息。")
# 在程序的最后,输出收集到的日志信息
output_collected_logs(collecting_handler)
在这个例子中,我们定义了一个CollectingHandler
类,它继承自BufferingHandler
。这个处理器的目的是缓存所有接收到的日志记录,直到我们决定输出它们。我们重写了shouldFlush
方法,使其始终返回False
,这样日志就不会立即刷新输出。
然后,我们定义了一个output_collected_logs
函数,它接受一个CollectingHandler
实例作为参数,并遍历其内部缓冲区中的所有日志记录,将它们格式化后输出。
在程序的最后,我们调用output_collected_logs
函数来输出所有收集到的日志信息。这种方法允许你在程序执行期间收集日志信息,并在需要时统一输出。
import hashlib
filename = input("Enter the file name: ")
md5_hash = hashlib.md5()
with open(filename,"rb") as f:
# Read and update hash in chunks of 4K
for byte_block in iter(lambda: f.read(4096),b""):
md5_hash.update(byte_block)
print(md5_hash.hexdigest())
这是上面的程序是动作,
python3 md5hash2.py
输入文件名:md5hash2.py
0101ae2ac06b8a52154100e37d8bafea
im-SHA1作为文件名。
请求文件名
希望提供一个函数,替换print函数,但,打印是在最后输出的信息。