# Copyright (c) 2024 Justin Davis (davisjustin302@gmail.com)## MIT License# mypy: disable-error-code="import-untyped"from__future__importannotationsimportcontextlibimportloggingimportosimportsysfromtypingimportTYPE_CHECKINGwithcontextlib.suppress(ImportError):importtensorrtastrtifTYPE_CHECKING:fromtypesimportTracebackTypefromtyping_extensionsimportSelf_LEVEL_MAP:dict[str|None,int]={"DEBUG":logging.DEBUG,"INFO":logging.INFO,"WARNING":logging.WARNING,"WARN":logging.WARNING,"ERROR":logging.ERROR,"CRITICAL":logging.CRITICAL,None:logging.WARNING,}def_setup_logger(level:str|None=None)->None:iflevelisnotNone:level=level.upper()try:log_level=_LEVEL_MAP[level]exceptKeyError:log_level=logging.WARNING# create loggerlogger=logging.getLogger(__package__)logger.setLevel(log_level)has_handler=Falseiflen(logger.handlers)>0:has_handler=Trueifnothas_handler:formatter=logging.Formatter("%(asctime)s [%(levelname)s] %(name)s: %(message)s",)stdout_handler=logging.StreamHandler(sys.stdout)stdout_handler.setLevel(log_level)stdout_handler.setFormatter(formatter)logger.addHandler(stdout_handler)else:logger.handlers[0].setLevel(log_level)logger.propagate=True
[docs]defset_log_level(level:str)->None:""" Set the log level for the trtutils package. Parameters ---------- level : str The log level to set. One of "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL". Raises ------ ValueError If the level is not one of the allowed values. """iflevel.upper()notin["DEBUG","INFO","WARNING","ERROR","CRITICAL"]:err_msg=f"Invalid log level: {level}"raiseValueError(err_msg)_setup_logger(level)
level=os.getenv("TRTUTILS_LOG_LEVEL")_setup_logger(level)_log=logging.getLogger(__name__)iflevelisnotNoneandlevel.upper()notin["DEBUG","INFO","WARNING","ERROR","CRITICAL",]:_log.warning(f"Invalid log level: {level}. Using default log level: WARNING")# create a TensorRT compatible loggerclassTRTLogger(trt.ILogger):# type: ignore[misc]""" Logger that implements TensorRT's ILogger interface while using Python's logging system. This class bridges TensorRT's logging system with Python's standard logging module, allowing TensorRT log messages to be handled by the Python logging framework. It also provides convenience methods that match Python's standard logging levels. Examples -------- >>> logger = TRTLogger() >>> logger.info("Starting TensorRT engine build") >>> with trt.Builder(logger) as builder: ... # TensorRT will use the logger for its messages ... pass """def__init__(self:Self)->None:""" Initialize the TensorRT logger. Creates a logger that implements TensorRT's ILogger interface and delegates to a Python logging.Logger instance internally. """super().__init__()self._logger=logging.getLogger("trtutils")self._level=self._logger.getEffectiveLevel()@propertydeflogger(self:Self)->logging.Logger:""" Get the internal Python logger. Returns ------- logging.Logger The internal Python logger instance. """returnself._logger@propertydeflevel(self:Self)->int:""" Get the current log level. Returns ------- int The current log level of the logger. """returnself._levelclass_LogLevelContext:def__init__(self:Self,logger:TRTLogger,level:str|None)->None:self._logger=loggerself._level=levelself._old_level=logger.logger.getEffectiveLevel()def__enter__(self:Self)->TRTLogger:ifself._level:lvl=self._level.upper()log_level=_LEVEL_MAP.get(lvl)iflog_levelisnotNone:self._logger.logger.setLevel(log_level)returnself._loggerdef__exit__(self:Self,exc_type:type[BaseException]|None,exc_val:BaseException|None,exc_tb:TracebackType|None,)->None:self._logger.logger.setLevel(self._old_level)defwith_level(self:Self,level:str|None)->_LogLevelContext:""" Create a context manager to temporarily set the log level. Parameters ---------- level : str | None The log level to set. One of "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL". Returns ------- _LogLevelContext A context manager that sets the log level for the duration of the block. """returnself._LogLevelContext(self,level)defsuppress(self:Self)->_LogLevelContext:""" Suppress all log messages. This method sets the logger's level to CRITICAL, effectively silencing all log messages. Returns ------- _LogLevelContext A context manager that suppresses all log messages. """returnself._LogLevelContext(self,"CRITICAL")deflog(self:Self,severity:trt.ILogger.Severity,msg:str)->None:""" Log a message with the specified severity. This method implements TensorRT's ILogger.log method and maps TensorRT severity levels to Python logging levels. Parameters ---------- severity : trt.ILogger.Severity TensorRT-specific severity level of the message msg : str The log message to record """ifseverity==trt.ILogger.Severity.INFO:self._logger.info(msg)elifseverity==trt.ILogger.Severity.WARNING:self._logger.warning(msg)elifseverity==trt.ILogger.Severity.ERROR:self._logger.error(msg)else:self._logger.debug(msg)defdebug(self:Self,msg:str)->None:""" Log a debug message. Parameters ---------- msg : str The debug message to log """self._logger.debug(msg)definfo(self:Self,msg:str)->None:""" Log an info message. Parameters ---------- msg : str The info message to log """self._logger.info(msg)defwarning(self:Self,msg:str)->None:""" Log a warning message. Parameters ---------- msg : str The warning message to log """self._logger.warning(msg)deferror(self:Self,msg:str)->None:""" Log an error message. Parameters ---------- msg : str The error message to log """self._logger.error(msg)defcritical(self:Self,msg:str)->None:""" Log a critical message. Parameters ---------- msg : str The critical message to log """self._logger.critical(msg)LOG=TRTLogger()