logger.py 3.1 KB

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