Logger.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import logging
  2. from logging.handlers import TimedRotatingFileHandler
  3. import os
  4. from datetime import datetime
  5. LOG_FORMAT = "%(asctime)s [%(levelname)s] %(message)s"
  6. def _build_logger(name: str, log_file: str) -> logging.Logger:
  7. logger_obj = logging.getLogger(name)
  8. if logger_obj.handlers:
  9. return logger_obj
  10. logger_obj.setLevel(logging.DEBUG)
  11. logger_obj.propagate = False
  12. console_handler = logging.StreamHandler()
  13. console_handler.setLevel(logging.INFO)
  14. file_handler = logging.FileHandler(log_file, encoding="utf-8")
  15. file_handler.setLevel(logging.DEBUG)
  16. formatter = logging.Formatter(LOG_FORMAT)
  17. console_handler.setFormatter(formatter)
  18. file_handler.setFormatter(formatter)
  19. logger_obj.addHandler(console_handler)
  20. logger_obj.addHandler(file_handler)
  21. return logger_obj
  22. def get_spider_logger(spider_name: str) -> logging.Logger:
  23. base_dir = os.path.join("logs", spider_name)
  24. os.makedirs(base_dir, exist_ok=True)
  25. time_str = datetime.now().strftime("%Y-%m-%d_%H-%M")
  26. log_file = os.path.join(base_dir, f"{spider_name}_{time_str}.log")
  27. return _build_logger(f"spider.{spider_name}", log_file)
  28. import sys
  29. # Extract a sensible prefix from the script name (e.g., jd or taobao)
  30. script_name = os.path.basename(sys.argv[0]).lower()
  31. if 'jd' in script_name:
  32. prefix = 'jd'
  33. elif 'taobao' in script_name:
  34. prefix = 'taobao'
  35. else:
  36. prefix = 'app'
  37. time_str = datetime.now().strftime("%Y-%m-%d_%H-%M")
  38. legacy_dir = "logs"
  39. os.makedirs(legacy_dir, exist_ok=True)
  40. legacy_file = os.path.join(legacy_dir, f"{prefix}_{time_str}.log")
  41. logger = _build_logger("MyLogger", legacy_file)
  42. # 测试
  43. # logger.debug("调试信息")
  44. # logger.info("普通提示信息")
  45. # logger.warning("警告信息")
  46. # logger.error("错误信息")
  47. # logger.critical("严重错误信息")