""" log module-based on loguru """ import sys from pathlib import Path from loguru import logger from src.config.settings import settings class Logger: """logger cls""" def __init__(self): """init config""" self._context_name = None self._setup_logger() def _setup_logger(self): """setup logger""" # remove logger logger.remove() # make sure file path exist log_dir = Path(settings.LOG_FILE_PATH).parent log_dir.mkdir(exist_ok=True) # add stdout handler logger.add( sys.stdout, format="{time:YYYY-MM-DD HH:mm:ss} | " "{level: <8} | " "{name}:{function}:{line} - " "{message}", level=settings.LOG_LEVEL, colorize=True ) # add file handler logger.add( settings.LOG_FILE_PATH, format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}", level=settings.LOG_LEVEL, rotation=settings.LOG_ROTATION, retention=settings.LOG_RETENTION, compression="zip", encoding="utf-8" ) def get_logger(self, name: str = None): """get logger self""" if name: # set context name self._context_name = name return self return self def __getattr__(self, name): """get loguru logger""" if self._context_name: bound_logger = logger.bind(name=self._context_name) else: bound_logger = logger return getattr(bound_logger, name) def log_conversation_start(self, attack_model: str, victim_model: str, topic: str, max_rounds: int): """start conversation log""" logger.info( f"Conversation start: - Attack model: {attack_model}, Victim model: {victim_model}, topic: {topic},max rounds: {max_rounds}") def log_model_response(self, model_type: str, model_name: str, round_num: int, response_length: int): """model response log """ logger.info( f"Model response - model type: {model_type}, model name: {model_name}, dialogue round: {round_num}, response length: {response_length}") def log_conversation_end(self, total_rounds: int, total_tokens: int = None): """the end of conversation log """ logger.info(f"The end of conversation - total rounds: {total_rounds}, costed tokens: {total_tokens or 'unknown'}") def log_error(self, error: Exception, context: str = ""): """error log""" logger.error(f"Error - context: {context}, error info: {str(error)}", exc_info=True) # instance logger app_logger = Logger()