| import logging | |
| import os | |
| import sys | |
| import threading | |
| from typing import Optional | |
| from .settings_utils import get_settings | |
| settings = get_settings() | |
| _lock = threading.Lock() | |
| _default_handler: Optional[logging.Handler] = None | |
| log_levels = { | |
| "debug": logging.DEBUG, | |
| "info": logging.INFO, | |
| "warning": logging.WARNING, | |
| "error": logging.ERROR, | |
| "critical": logging.CRITICAL, | |
| } | |
| def _get_default_logging_level(): | |
| try: | |
| return log_levels[settings.default_verbosity] | |
| except KeyError as e: | |
| raise ValueError( | |
| f"unitxt.settings.default_verobsity or env variable UNITXT_DEFAULT_VERBOSITY has to be one of: { ', '.join(log_levels.keys()) }. Got {settings.default_verbosity}." | |
| ) from e | |
| def _get_library_root_logger() -> logging.Logger: | |
| return logging.getLogger(__name__.split(".")[0]) | |
| class SizeLimitedFormatter(logging.Formatter): | |
| def format(self, record): | |
| original_message = super().format(record) | |
| max_size = settings.max_log_message_size | |
| if len(original_message) > max_size: | |
| return ( | |
| original_message[:max_size] | |
| + f"...\n(Message is too long > {max_size}. Can be set through unitxt.settings.max_log_message_size or UNITXT_MAX_LOG_MESSAGE_SIZE environment variable.)" | |
| ) | |
| return original_message | |
| def _configure_library_root_logger() -> None: | |
| global _default_handler | |
| with _lock: | |
| if _default_handler is not None: | |
| return | |
| _default_handler = logging.StreamHandler(sys.stdout) | |
| if sys.stderr is None: | |
| sys.stderr = open(os.devnull, "w") | |
| _default_handler.flush = sys.stderr.flush | |
| _default_handler.setFormatter(SizeLimitedFormatter()) | |
| library_root_logger = _get_library_root_logger() | |
| library_root_logger.addHandler(_default_handler) | |
| library_root_logger.setLevel(_get_default_logging_level()) | |
| library_root_logger.propagate = False | |
| def get_logger(name: Optional[str] = None) -> logging.Logger: | |
| if name is None: | |
| name = __name__.split(".")[0] | |
| _configure_library_root_logger() | |
| return logging.getLogger(name) | |
| settings._logger = get_logger("settings") | |
| def set_verbosity(level): | |
| _configure_library_root_logger() | |
| _get_library_root_logger().setLevel(log_levels.get(level)) | |
| def enable_explicit_format() -> None: | |
| for handler in _get_library_root_logger().handlers: | |
| formatter = SizeLimitedFormatter( | |
| "[Unitxt|%(levelname)s|%(filename)s:%(lineno)s] %(asctime)s >> %(message)s" | |
| ) | |
| handler.setFormatter(formatter) | |