python使用logging按每小时一个日志文件,超过10MB创建新的文件,每天生成一个目录存放
效果图

工程结构

log_manager.py
# log_manager.py import logging import logging.handlers import os from datetime import datetime class LogManager: _instance = None _loggers = {} def __new__(cls): if cls._instance is None: cls._instance = super(LogManager, cls).__new__(cls) cls._instance._initialize() return cls._instance def _initialize(self): """初始化日志配置""" self.log_dir = 'logs' os.makedirs(self.log_dir, exist_ok=True) print(f"日志管理器初始化完成,日志目录: {self.log_dir}") def get_logger(self, name='app'): """获取或创建logger""" if name not in self._loggers: logger = logging.getLogger(name) logger.setLevel(logging.INFO) # 清除已有的handler if logger.handlers: logger.handlers.clear() # 创建每日目录 current_date = datetime.now().strftime('%Y-%m-%d') daily_dir = os.path.join(self.log_dir, current_date) os.makedirs(daily_dir, exist_ok=True) # 文件handler - 每小时轮转,最大10MB log_file = os.path.join(daily_dir, f'{name}.log') file_handler = logging.handlers.RotatingFileHandler( log_file, maxBytes=10*1024*1024, backupCount=24, encoding='utf-8' ) # 控制台handler console_handler = logging.StreamHandler() # 格式 formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) file_handler.setFormatter(formatter) console_handler.setFormatter(formatter) logger.addHandler(file_handler) logger.addHandler(console_handler) logger.propagate = False self._loggers[name] = logger print(f"创建logger: {name}") return self._loggers[name] # 创建全局实例 log_manager = LogManager()
main.py
# main.py from log_manager import log_manager def main(): # 获取主程序的logger logger = log_manager.get_logger('main') logger.info("=== 程序启动 ===") logger.info("开始执行主程序") # 记录不同级别的日志 logger.debug("这是一条调试信息") logger.info("这是一条信息日志") logger.warning("这是一条警告信息") # 模拟业务逻辑 try: result = process_data() logger.info(f"数据处理完成,结果: {result}") # 调用其他函数 validate_data(result) except Exception as e: logger.error(f"程序执行出错: {e}", exc_info=True) logger.info("=== 程序结束 ===") def process_data(): # 为这个函数创建专门的logger process_logger = log_manager.get_logger('process') process_logger.info("开始处理数据") # 模拟数据处理 data = [1, 2, 3, 4, 5] process_logger.debug(f"处理的数据: {data}") result = sum(data) process_logger.info(f"数据处理完成,总和: {result}") return result def validate_data(data): # 使用main模块的logger logger = log_manager.get_logger('main') logger.info("开始验证数据") if data > 10: logger.warning(f"数据值较大: {data}") else: logger.info(f"数据验证通过: {data}") if __name__ == "__main__": main()

浙公网安备 33010602011771号