多模块使用含时间戳日志文件导致重复创建问题求助
解决方案
要解决多模块导入时生成多个带时间戳日志文件的问题,核心是确保日志配置只执行一次,且时间戳仅在首次初始化时生成。以下是两种可行的实现方式:
方式一:通过模块级变量复用Logger
利用Python模块的单例特性(模块仅在首次导入时加载),在base_logger.py中维护一个全局Logger实例,时间戳在模块加载时生成:
import logging from datetime import datetime # 模块级变量:存储已初始化的Logger和首次初始化时间戳 _global_logger = None _init_timestamp = datetime.now().strftime("%Y%m%d-%H%M%S") def get_logger(): global _global_logger # 若Logger已初始化,直接返回 if _global_logger is not None: return _global_logger # 初始化Logger logger = logging.getLogger("app") logger.setLevel(logging.INFO) # 避免重复添加Handler(防止其他地方重复配置同一Logger) if logger.handlers: _global_logger = logger return _global_logger # 使用首次初始化的时间戳生成日志文件名 log_filename = f"app-INFO-{_init_timestamp}.log" # 配置文件Handler和格式 file_handler = logging.FileHandler(log_filename) formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") file_handler.setFormatter(formatter) logger.addHandler(file_handler) _global_logger = logger return logger
方式二:模块加载时直接完成配置
更简洁的写法:在模块加载阶段就完成日志配置,后续所有模块直接复用已配置好的Logger:
import logging from datetime import datetime # 模块加载时生成时间戳并配置日志 _init_timestamp = datetime.now().strftime("%Y%m%d-%H%M%S") log_filename = f"app-INFO-{_init_timestamp}.log" # 创建并配置Logger logger = logging.getLogger("app") logger.setLevel(logging.INFO) # 仅在无Handler时添加(避免重复配置) if not logger.handlers: file_handler = logging.FileHandler(log_filename) formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") file_handler.setFormatter(formatter) logger.addHandler(file_handler) def get_logger(): return logger
关键说明
- Python模块是单例的:
base_logger.py仅在第一个导入它的模块中执行一次初始化代码,后续导入只会复用已加载的模块内容,因此时间戳只会生成一次。 - 避免重复Handler:检查
logger.handlers可以防止其他地方通过logging.getLogger("app")重复添加Handler,导致日志重复输出。 - 原全局变量方案失效原因:若你之前将
initialised定义在函数内部或未正确使用global关键字,会导致每次调用get_logger时重置状态;而模块级变量不存在这个问题。
内容的提问来源于stack exchange,提问作者AlexP
相关产品推荐
相关产品推荐

