From 229cae06905179148e100237d485f3f56222bbcb Mon Sep 17 00:00:00 2001 From: David Noack Date: Wed, 22 Jan 2025 17:06:23 +0100 Subject: [PATCH] chore(core): improve logging control and experience (#610) --- python/src/uagents/agent.py | 6 ++++-- python/src/uagents/network.py | 11 +++++++---- python/src/uagents/registration.py | 15 +++++++++++++-- python/src/uagents/utils.py | 15 +++++++++++++++ 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/python/src/uagents/agent.py b/python/src/uagents/agent.py index 3d2bba11..fa238af7 100644 --- a/python/src/uagents/agent.py +++ b/python/src/uagents/agent.py @@ -83,7 +83,7 @@ RestMethod, RestPostHandler, ) -from uagents.utils import get_logger +from uagents.utils import get_logger, set_global_log_level async def _run_interval( @@ -329,6 +329,8 @@ def __init__( # initialize wallet and identity self._initialize_wallet_and_identity(seed, name, wallet_key_derivation_index) + if log_level != logging.INFO: + set_global_log_level(log_level) self._logger = get_logger(self.name, level=log_level) self._agentverse = parse_agentverse_config(agentverse) @@ -379,7 +381,6 @@ def __init__( self._wallet, self._almanac_contract, self._test, - logger=self._logger, almanac_api=self._almanac_api_url, ) self._metadata = self._initialize_metadata(metadata) @@ -726,6 +727,7 @@ def sign_digest(self, digest: bytes) -> str: """ return self._identity.sign_digest(digest) + # TODO this is not used anywhere in the framework def sign_registration( self, timestamp: int, sender_wallet_address: Optional[str] = None ) -> str: diff --git a/python/src/uagents/network.py b/python/src/uagents/network.py index 71aad7e8..c9fb2259 100644 --- a/python/src/uagents/network.py +++ b/python/src/uagents/network.py @@ -184,10 +184,11 @@ def check_version(self) -> bool: "Update uAgents to the latest version to enable contract interactions.", ) return False - except Exception: + except Exception as e: logger.error( "Failed to query contract version. Contract interactions will be disabled." ) + logger.debug(e) return False return True @@ -210,7 +211,8 @@ def query_contract(self, query_msg: Dict[str, Any]) -> Any: raise ValueError("Invalid response format") return response except Exception as e: - logger.error(f"Query failed: {e}") + logger.error(f"Query failed with error: {e.__class__.__name__}.") + logger.debug(e) raise def get_contract_version(self) -> str: @@ -528,7 +530,7 @@ def query_contract(self, query_msg: Dict[str, Any]) -> Any: Any: The query response. Raises: - RuntimeError: If the contract address is not set or the query fails. + ValueError: If the response from contract is not a dict. """ try: response = self.query(query_msg) @@ -536,7 +538,8 @@ def query_contract(self, query_msg: Dict[str, Any]) -> Any: raise ValueError("Invalid response format") return response except Exception as e: - logger.error(f"Query failed: {e}") + logger.error(f"Querying NameServiceContract failed for query {query_msg}.") + logger.debug(e) raise def is_name_available(self, name: str, domain: str) -> bool: diff --git a/python/src/uagents/registration.py b/python/src/uagents/registration.py index 37f9b92d..51218cab 100644 --- a/python/src/uagents/registration.py +++ b/python/src/uagents/registration.py @@ -440,8 +440,12 @@ async def register( self._logger.warning( f"Failed to register on Almanac API: {e.__class__.__name__}" ) + self._logger.debug(e) if self._ledger_policy is None: + self._logger.info( + "No Ledger available. Skipping registration on Almanac contract." + ) return # schedule the ledger registration @@ -455,7 +459,10 @@ async def register( ) raise except Exception as e: - self._logger.error(f"Failed to register on Almanac contract: {e}") + self._logger.error( + f"Failed to register on Almanac contract: {e.__class__.__name__}" + ) + self._logger.debug(e) raise @@ -504,6 +511,7 @@ async def register(self): self._logger.warning( f"Failed to batch register on Almanac API: {e.__class__.__name__}" ) + self._logger.debug(e) if self._ledger_policy is None: return @@ -517,5 +525,8 @@ async def register(self): ) raise except Exception as e: - self._logger.error(f"Failed to batch register on Almanac contract: {e}") + self._logger.error( + f"Failed to batch register on Almanac contract: {e.__class__.__name__}" + ) + self._logger.debug(e) raise diff --git a/python/src/uagents/utils.py b/python/src/uagents/utils.py index ded16796..8603d0ca 100644 --- a/python/src/uagents/utils.py +++ b/python/src/uagents/utils.py @@ -35,4 +35,19 @@ def log(logger: Optional[logging.Logger], level: int, message: str): BACKUP_LOGGER.log(level, message) +def set_global_log_level(level: Union[int, str]): + """ + Set the log level for all modules globally. Can still be overruled manually. + + Args: + level (Union[int, str]): The logging level as defined in _logging_. + """ + logging.basicConfig(level=level) + # the manager of the root logger should be its only instance and contain + # all loggers of the process. Update the new log level in all of them. + for name in logging.Logger.manager.loggerDict: + # TODO only apply to framework loggers? + logging.getLogger(name).setLevel(level) + + BACKUP_LOGGER = get_logger("uagents", logging.INFO)