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

效果图

image

 工程结构

image

 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()

 

posted @ 2025-08-22 16:52  海乐学习  阅读(16)  评论(0)    收藏  举报