| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- # 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)
|