diff --git a/multiversx_sdk_cli/cli.py b/multiversx_sdk_cli/cli.py index a957cd1b..16acbb32 100644 --- a/multiversx_sdk_cli/cli.py +++ b/multiversx_sdk_cli/cli.py @@ -30,7 +30,7 @@ import multiversx_sdk_cli.version from multiversx_sdk_cli import config, errors, utils, ux from multiversx_sdk_cli.cli_shared import set_proxy_from_config_if_not_provided -from multiversx_sdk_cli.constants import SDK_PATH +from multiversx_sdk_cli.constants import LOG_LEVELS, SDK_PATH from multiversx_sdk_cli.env import get_address_hrp logger = logging.getLogger("cli") @@ -54,7 +54,7 @@ def _do_main(cli_args: list[str]): parser = setup_parser(cli_args) argcomplete.autocomplete(parser) - _handle_verbose_argument(cli_args) + _handle_global_arguments(cli_args) args = parser.parse_args(cli_args) if args.verbose: @@ -65,8 +65,9 @@ def _do_main(cli_args: list[str]): handlers=[RichHandler(show_time=False, rich_tracebacks=True)], ) else: + level: str = args.log_level logging.basicConfig( - level="INFO", + level=level.upper(), format="%(name)s: %(message)s", handlers=[RichHandler(show_time=False, rich_tracebacks=True)], ) @@ -112,6 +113,13 @@ def setup_parser(args: list[str]): version=f"MultiversX Python CLI (mxpy) {version}", ) parser.add_argument("--verbose", action="store_true", default=False) + parser.add_argument( + "--log-level", + type=str, + default=config.get_log_level_from_config(), + choices=LOG_LEVELS, + help="default: %(default)s", + ) subparsers = parser.add_subparsers() commands: list[Any] = [] @@ -159,11 +167,24 @@ def verify_deprecated_entries_in_config_file(): ux.show_warning(message.rstrip("\n")) -def _handle_verbose_argument(args: list[str]): - verbose_arg = "--verbose" - if verbose_arg in args: - args.remove(verbose_arg) - args.insert(0, verbose_arg) +def _handle_global_arguments(args: list[str]): + """ + Handle global arguments like --verbose and --log-level. + """ + log_level_arg = "--log-level" + if log_level_arg in args: + index = args.index(log_level_arg) + if index + 1 >= len(args): + raise ValueError(f"Argument {log_level_arg} must be followed by a log level value.") + + log_arg = args.pop(index) + log_value = args.pop(index) + args.insert(0, log_value) + args.insert(0, log_arg) + + if "--verbose" in args: + args.remove("--verbose") + args.insert(0, "--verbose") if __name__ == "__main__": diff --git a/multiversx_sdk_cli/config.py b/multiversx_sdk_cli/config.py index 3df425ef..9b6c89b5 100644 --- a/multiversx_sdk_cli/config.py +++ b/multiversx_sdk_cli/config.py @@ -6,7 +6,8 @@ from multiversx_sdk import NetworkProviderConfig from multiversx_sdk_cli import errors, utils -from multiversx_sdk_cli.constants import SDK_PATH +from multiversx_sdk_cli.constants import LOG_LEVELS, SDK_PATH +from multiversx_sdk_cli.ux import show_warning LOCAL_CONFIG_PATH = Path("mxpy.json").resolve() GLOBAL_CONFIG_PATH = SDK_PATH / "mxpy.json" @@ -136,9 +137,20 @@ def get_defaults() -> dict[str, Any]: "dependencies.testwallets.urlTemplate.osx": "https://github.com/multiversx/mx-sdk-testwallets/archive/{TAG}.tar.gz", "dependencies.testwallets.urlTemplate.windows": "https://github.com/multiversx/mx-sdk-testwallets/archive/{TAG}.tar.gz", "github_api_token": "", + "log_level": "info", } +def get_log_level_from_config() -> str: + log_level = get_value("log_level") + if log_level not in LOG_LEVELS: + default_log_level: str = get_defaults()["log_level"] + show_warning(f"Invalid log level set in config: [{log_level}]. Defaulting to [{default_log_level}].") + return default_log_level + + return log_level + + def get_deprecated_entries_in_config_file(): default_config_keys = set(get_defaults().keys()) current_config_keys = set(get_active().keys()) diff --git a/multiversx_sdk_cli/constants.py b/multiversx_sdk_cli/constants.py index 26129b8f..803889fe 100644 --- a/multiversx_sdk_cli/constants.py +++ b/multiversx_sdk_cli/constants.py @@ -30,3 +30,5 @@ MAINCHAIN_ADDRESS_HRP = "erd" SDK_PATH = Path("~/multiversx-sdk").expanduser().resolve() + +LOG_LEVELS = ["debug", "info", "warning", "error"]