# logger_config.py import logging import os from logging import handlers from datetime import datetime import sys class ColorFormatter(logging.Formatter): """自定义彩色日志格式化器(仅控制台输出带颜色,文件日志无颜色)""" # 终端颜色编码 COLORS = { 'DEBUG': '\033[36m', # 青色 'INFO': '\033[32m', # 绿色 'WARNING': '\033[33m', # 黄色 'ERROR': '\033[31m', # 红色 'CRITICAL': '\033[41m', # 红底白字 'RESET': '\033[0m' # 重置颜色 } # 日志级别对应图标 ICONS = { 'DEBUG': '🐞', 'INFO': '✅', 'WARNING': '⚠️', 'ERROR': '❌', 'CRITICAL': '💥' } def format(self, record): # 为控制台添加颜色和图标,文件日志保持纯文本 if hasattr(sys.stderr, 'isatty') and sys.stderr.isatty(): # 彩色格式:[时间] [图标 级别] [模块:行号] 信息 color = self.COLORS.get(record.levelname, self.COLORS['RESET']) icon = self.ICONS.get(record.levelname, '') record.levelname = f"{color}{icon} {record.levelname}{self.COLORS['RESET']}" record.msg = f"{color}{record.msg}{self.COLORS['RESET']}" # 调用父类格式化方法 return super().format(record) def setup_logger(level=logging.DEBUG): """ 配置日志器: 1. 自动创建logs文件夹 2. 日志文件带时间戳,按大小分割(10MB/个,保留5个备份) 3. 控制台输出带颜色/图标,文件日志纯文本(更规范) 4. 支持自定义日志级别(默认DEBUG,可传INFO/WARNING等) 5. 日志格式包含:时间、级别、进程ID、模块、行号、信息 """ # 1. 自动创建logs文件夹(不存在则创建) log_dir = "logs" os.makedirs(log_dir, exist_ok=True) # exist_ok=True:文件夹已存在时不报错 # 2. 生成时间戳(格式:年月日_时分秒,如20260112_164530) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") # 生成时间戳 # 3. 定义带时间戳的日志文件路径 log_file = os.path.join(log_dir, f"yjj_crawl_log_{timestamp}.txt") # 4. 创建日志器并设置级别 logger = logging.getLogger("yjj_crawler") logger.setLevel(level) logger.propagate = False # 避免重复输出 # 清空已有处理器(防止重复添加) if logger.handlers: logger.handlers.clear() # 5. 配置文件处理器(美化格式,保存到logs文件夹) file_handler = handlers.RotatingFileHandler( log_file, encoding="utf-8", maxBytes=10*1024*1024, # 单个日志文件最大10MB backupCount=5, # 最多保留5个备份日志文件 mode="a" # 追加模式 ) # 文件日志美化格式:时间戳 | 级别 | 信息(带图标/模块标注) file_formatter = logging.Formatter( "[%(asctime)s] [%(levelname)-8s] [PID:%(process)d] [%(module)s:%(lineno)d] %(message)s", datefmt="%Y-%m-%d %H:%M:%S" # 精确到微秒 ) file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) # 5. 配置控制台处理器(简洁格式,仅输出信息) console_handler = logging.StreamHandler() console_formatter = ColorFormatter( "[%(asctime)s] %(levelname)-8s %(message)s", datefmt="%H:%M:%S" # 控制台仅显示时分秒,更简洁 ) console_handler.setFormatter(console_formatter) # 6. 添加处理器到日志器 console_handler.setFormatter(console_formatter) logger.addHandler(console_handler) return logger # 创建全局可调用的logger对象 logger = setup_logger(level=logging.INFO)