import logging from asyncio import CancelledError from codemp import PyLogger class CodempLogger: def __init__(self, log_level): self.logger = logging.getLogger(__name__) self.level = log_level self.logger.setLevel(self.level) self.internal_logger = None self.started = False try: # PyLogger spins a tracing_subscriber rust side with a # .try_init() and errors out if already initialized. # initialize only once self.internal_logger = PyLogger(self.level == logging.DEBUG) except Exception: pass async def listen(self): if self.started: return self.started = True self.logger.debug("spinning up internal logger listener...") assert self.internal_logger is not None try: while msg := await self.internal_logger.listen(): self.logger.log(self.level, msg) except CancelledError: self.logger.debug("inner logger stopped.") self.started = False raise except Exception as e: self.logger.error(f"inner logger crashed unexpectedly: \n {e}") raise e def log(self, msg): self.logger.log(self.level, msg) inner_logger = CodempLogger(logging.INFO)