logger.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import logging
  2. import yaml
  3. import os
  4. from colorama import Fore, Style
  5. import colorama
  6. import re
  7. colorama.init()
  8. def parse_size(size_str):
  9. """Convert human readable size string to bytes"""
  10. if isinstance(size_str, (int, float)):
  11. return int(size_str)
  12. units = {
  13. 'B': 1,
  14. 'KB': 1024,
  15. 'MB': 1024 * 1024,
  16. 'GB': 1024 * 1024 * 1024,
  17. 'TB': 1024 * 1024 * 1024 * 1024
  18. }
  19. # Extract number and unit
  20. match = re.match(r'^(\d+)\s*([A-Za-z]+)?$', str(size_str).strip())
  21. if not match:
  22. return 100 * 1024 * 1024 # Default to 100MB if parsing fails
  23. number, unit = match.groups()
  24. unit = unit.upper() if unit else 'B'
  25. # Convert to bytes
  26. return int(float(number) * units.get(unit, 1))
  27. class ColoredFormatter(logging.Formatter):
  28. COLOR_MAP = {
  29. logging.DEBUG: Fore.BLUE,
  30. logging.INFO: Fore.GREEN,
  31. logging.WARNING: Fore.YELLOW,
  32. logging.ERROR: Fore.RED,
  33. logging.CRITICAL: Fore.MAGENTA
  34. }
  35. def format(self, record):
  36. msg = record.getMessage()
  37. original_msg = record.msg
  38. color = self.COLOR_MAP.get(record.levelno, '')
  39. msg = color + msg + Style.RESET_ALL
  40. record.msg = msg
  41. formatted_message = super().format(record)
  42. # 恢复原始消息
  43. record.msg = original_msg
  44. return formatted_message
  45. def load_config():
  46. config_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'config.yml')
  47. with open(config_path, 'r') as f:
  48. return yaml.safe_load(f)
  49. def setup_logger():
  50. config = load_config()
  51. log_config = config.get('log', {})
  52. # Configure logger
  53. logger = logging.getLogger('repo_sync')
  54. logger.setLevel(getattr(logging, log_config.get('level', 'INFO').upper()))
  55. # Create console handler
  56. console_handler = logging.StreamHandler()
  57. console_handler.setLevel(getattr(logging, log_config.get('console_formatter', {}).get('level', 'INFO').upper()))
  58. # Create file handler with rotation
  59. from logging.handlers import RotatingFileHandler
  60. file_handler = RotatingFileHandler(
  61. log_config.get('file', 'repo_sync.log'),
  62. maxBytes=parse_size(log_config.get('max_size', '100MB')), # Parse human-readable size
  63. backupCount=int(log_config.get('max_backups', 3))
  64. )
  65. file_handler.setLevel(getattr(logging, log_config.get('file_formatter', {}).get('level', 'INFO').upper()))
  66. # Use the custom colored formatter for console
  67. console_formatter = ColoredFormatter(log_config.get('console_formatter', {}).get('format', '%(asctime)s - %(levelname)s - %(message)s'))
  68. console_handler.setFormatter(console_formatter)
  69. # Use standard formatter for file
  70. file_formatter = logging.Formatter(log_config.get('file_formatter', {}).get('format', '%(asctime)s - %(levelname)s - %(message)s'))
  71. file_handler.setFormatter(file_formatter)
  72. # Add handlers to logger
  73. logger.addHandler(console_handler)
  74. logger.addHandler(file_handler)
  75. return logger
  76. # Initialize logger
  77. logger = setup_logger()
  78. # Export logger
  79. __all__ = ['logger']