如何在Python每个日志文件开头添加创建者等基础信息?
问题
在Python中使用RotatingFileHandler生成滚动日志文件,当前已能生成新日志文件,但希望在新日志文件创建时,自动在开头添加如下格式的基础信息:
#--------------------------# # Created by : xxx # Employee ID : xxx # Date : xxxx #--------------------------#
现有日志实现代码如下:
def errorlog(cls, filename, level=logging.DEBUG): file_handler = RotatingFileHandler( os.path.join(BASE_DIR, name, filename), maxBytes=100, mode= write_mode, backupCount=10, ) file_handler.setFormatter(formatter) if (logger.hasHandlers()): logger.handlers.clear() logger.addHandler(file_handler)
请问该如何实现上述需求?
解决方案
要实现新日志文件创建时自动写入头部信息,需自定义RotatingFileHandler子类,重写doRollover方法——该方法负责日志滚动逻辑,我们在其中添加写入头部的操作。
1. 自定义滚动日志处理器
继承RotatingFileHandler,重写doRollover,同时在初始化时处理空日志文件的头部写入:
import logging.handlers import os from datetime import datetime class HeaderRotatingFileHandler(logging.handlers.RotatingFileHandler): def __init__(self, *args, **kwargs): self.header = kwargs.pop('header', '') super().__init__(*args, **kwargs) # 初始化时若日志文件为空,写入头部 if os.path.exists(self.baseFilename) and os.path.getsize(self.baseFilename) == 0: self.stream.write(self.header + '\n') self.stream.flush() def doRollover(self): super().doRollover() # 滚动后向新文件写入头部 if self.stream: self.stream.write(self.header + '\n') self.stream.flush()
2. 构造头部信息
编写函数生成符合格式的头部内容:
def generate_header(): created_by = "xxx" emp_id = "xxx" current_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S") return ( "#--------------------------#\n" f"# Created by : {created_by}\n" f"# Employee ID : {emp_id}\n" f"# Date : {current_date}\n" "#--------------------------#" )
3. 修改原日志初始化代码
替换原RotatingFileHandler为自定义处理器,传入头部信息:
def errorlog(cls, filename, level=logging.DEBUG): header_content = generate_header() file_handler = HeaderRotatingFileHandler( os.path.join(BASE_DIR, name, filename), maxBytes=100, mode=write_mode, backupCount=10, header=header_content ) file_handler.setFormatter(formatter) if logger.hasHandlers(): logger.handlers.clear() logger.addHandler(file_handler)
关键说明
- 初始化时检测日志文件大小,为空则写入头部,覆盖首次创建文件的场景;
- 日志滚动触发
doRollover时,完成文件切换后立即写入头部,覆盖滚动生成新文件的场景; - 头部信息可动态生成,比如日期会自动取当前滚动/创建时的时间。
内容的提问来源于stack exchange,提问作者Mia Mia
相关产品推荐
相关产品推荐

