import logging from logging.handlers import RotatingFileHandler import sys class SingletonMeta(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(SingletonMeta, cls).__call__(*args, **kwargs) return cls._instances[cls] class LoggingManager(metaclass=SingletonMeta): def __init__(self, log_file): if not hasattr(self, "logger"): self.log_file = log_file self.logger = logging.getLogger("scraper") self.logger.setLevel(logging.DEBUG) file_handler = RotatingFileHandler( self.log_file, maxBytes=1024 * 1024 * 5, backupCount=5 ) file_handler.setLevel(logging.DEBUG) stream_handler = logging.StreamHandler(sys.stdout) stream_handler.setLevel(logging.DEBUG) formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) file_handler.setFormatter(formatter) stream_handler.setFormatter(formatter) self.logger.addHandler(file_handler) self.logger.addHandler(stream_handler) def log(self, message): self.logger.debug(message) def error(self, message): self.logger.error(message) def info(self, message): self.logger.info(message)