1616from databricks .sdk import WorkspaceClient
1717
1818from databricks .labs .blueprint .cli import App
19- from databricks .labs .blueprint .entrypoint import is_in_debug
19+ from databricks .labs .blueprint .entrypoint import get_logger
2020from databricks .labs .blueprint .installation import RootJsonValue , JsonObject , JsonValue
2121from databricks .labs .blueprint .tui import Prompts
2222
3030from databricks .labs .lakebridge .connections .credential_manager import cred_file
3131from databricks .labs .lakebridge .helpers .recon_config_utils import ReconConfigPrompts
3232from databricks .labs .lakebridge .helpers .telemetry_utils import make_alphanum_or_semver
33- from databricks .labs .lakebridge .install import installer
3433from databricks .labs .lakebridge .reconcile .runner import ReconcileRunner
3534from databricks .labs .lakebridge .lineage import lineage_generator
3635from databricks .labs .lakebridge .reconcile .recon_config import RECONCILE_OPERATION_NAME , AGG_RECONCILE_OPERATION_NAME
4847
4948# Subclass to allow controlled access to protected methods.
5049class Lakebridge (App ):
51- _logger_instance : logging .Logger | None = None
5250
5351 def create_workspace_client (self ) -> WorkspaceClient :
5452 """Create a workspace client, with the appropriate product and version information.
@@ -58,15 +56,25 @@ def create_workspace_client(self) -> WorkspaceClient:
5856 self ._patch_databricks_host ()
5957 return self ._workspace_client ()
6058
61- def get_logger (self ) -> logging .Logger :
62- if self ._logger_instance is None :
63- self ._logger_instance = self ._logger
64- self ._logger_instance .setLevel (logging .INFO )
65- return self ._logger_instance
59+ def _log_level (self , raw : str ) -> int :
60+ """Convert the log-level provided by the Databricks CLI into a logging level supported by Python."""
61+ log_level = super ()._log_level (raw )
62+ # Due to an issue in the handoff of the intended logging level from the Databricks CLI to our
63+ # application, we can't currently distinguish between --log-level=WARN and nothing at all, where we
64+ # prefer (and the application logging expects) INFO.
65+ #
66+ # Rather than default to only have WARNING logs show, it's preferable to default to INFO and have
67+ # --log-level=WARN not work for now.
68+ #
69+ # See: https://github.com/databrickslabs/lakebridge/issues/2167
70+ # TODO: Remove this once #2167 has been resolved.
71+ if log_level == logging .WARNING :
72+ log_level = logging .INFO
73+ return log_level
6674
6775
6876lakebridge = Lakebridge (__file__ )
69- logger = lakebridge . get_logger ()
77+ logger = get_logger (__file__ )
7078
7179
7280def raise_validation_exception (msg : str ) -> NoReturn :
@@ -745,6 +753,9 @@ def install_transpile(
745753 transpiler_repository : TranspilerRepository = TranspilerRepository .user_home (),
746754) -> None :
747755 """Install or upgrade the Lakebridge transpilers."""
756+ # Avoid circular imports.
757+ from databricks .labs .lakebridge .install import installer # pylint: disable=cyclic-import, import-outside-toplevel
758+
748759 is_interactive = interactive_mode (interactive )
749760 ctx = ApplicationContext (w )
750761 ctx .add_user_agent_extra ("cmd" , "install-transpile" )
@@ -804,6 +815,9 @@ def configure_reconcile(
804815 transpiler_repository : TranspilerRepository = TranspilerRepository .user_home (),
805816) -> None :
806817 """Configure the Lakebridge reconciliation module"""
818+ # Avoid circular imports.
819+ from databricks .labs .lakebridge .install import installer # pylint: disable=cyclic-import, import-outside-toplevel
820+
807821 ctx = ApplicationContext (w )
808822 ctx .add_user_agent_extra ("cmd" , "configure-reconcile" )
809823 user = w .current_user
@@ -1017,8 +1031,4 @@ def create_profiler_dashboard(
10171031
10181032
10191033if __name__ == "__main__" :
1020- app = lakebridge
1021- logger = app .get_logger ()
1022- if is_in_debug ():
1023- logger .setLevel (logging .DEBUG )
1024- app ()
1034+ lakebridge ()
0 commit comments