Skip to content

Commit 84da6ac

Browse files
authored
Feat(sqlmesh_dbt): Add support for --log-level (#5514)
1 parent fd54170 commit 84da6ac

File tree

5 files changed

+50
-4
lines changed

5 files changed

+50
-4
lines changed

sqlmesh/__init__.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,15 +188,23 @@ def configure_logging(
188188
write_to_file: bool = True,
189189
log_file_dir: t.Optional[t.Union[str, Path]] = None,
190190
ignore_warnings: bool = False,
191+
log_level: t.Optional[t.Union[str, int]] = None,
191192
) -> None:
192193
# Remove noisy grpc logs that are not useful for users
193194
os.environ["GRPC_VERBOSITY"] = os.environ.get("GRPC_VERBOSITY", "NONE")
194195

195196
logger = logging.getLogger()
196197
debug = force_debug or debug_mode_enabled()
197198

198-
# base logger needs to be the lowest level that we plan to log
199-
level = logging.DEBUG if debug else logging.INFO
199+
if log_level is not None:
200+
if isinstance(log_level, str):
201+
level = logging._nameToLevel.get(log_level.upper()) or logging.INFO
202+
else:
203+
level = log_level
204+
else:
205+
# base logger needs to be the lowest level that we plan to log
206+
level = logging.DEBUG if debug else logging.INFO
207+
200208
logger.setLevel(level)
201209

202210
if debug:

sqlmesh_dbt/cli.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,20 @@ def _cleanup() -> None:
7878
default=False,
7979
help="Display debug logging during dbt execution. Useful for debugging and making bug reports events to help when debugging.",
8080
)
81+
@click.option(
82+
"--log-level",
83+
default="info",
84+
type=click.Choice(["debug", "info", "warn", "error", "none"]),
85+
help="Specify the minimum severity of events that are logged to the console and the log file.",
86+
)
8187
@click.pass_context
8288
@cli_global_error_handler
8389
def dbt(
8490
ctx: click.Context,
8591
profile: t.Optional[str] = None,
8692
target: t.Optional[str] = None,
8793
debug: bool = False,
94+
log_level: t.Optional[str] = None,
8895
) -> None:
8996
"""
9097
An ELT tool for managing your SQL transformations and data models, powered by the SQLMesh engine.
@@ -97,7 +104,12 @@ def dbt(
97104
# we have a partially applied function here because subcommands might set extra options like --vars
98105
# that need to be known before we attempt to load the project
99106
ctx.obj = functools.partial(
100-
create, project_dir=Path.cwd(), profile=profile, target=target, debug=debug
107+
create,
108+
project_dir=Path.cwd(),
109+
profile=profile,
110+
target=target,
111+
debug=debug,
112+
log_level=log_level,
101113
)
102114

103115
if not ctx.invoked_subcommand:

sqlmesh_dbt/operations.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ def create(
237237
vars: t.Optional[t.Dict[str, t.Any]] = None,
238238
threads: t.Optional[int] = None,
239239
debug: bool = False,
240+
log_level: t.Optional[str] = None,
240241
) -> DbtOperations:
241242
with Progress(transient=True) as progress:
242243
# Indeterminate progress bar before SQLMesh import to provide feedback to the user that something is indeed happening
@@ -256,7 +257,7 @@ def create(
256257
while root_logger.hasHandlers():
257258
root_logger.removeHandler(root_logger.handlers[0])
258259

259-
configure_logging(force_debug=debug)
260+
configure_logging(force_debug=debug, log_level=log_level)
260261
set_console(DbtCliConsole())
261262

262263
progress.update(load_task_id, description="Loading project", total=None)

tests/dbt/cli/test_global_flags.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import typing as t
22
from pathlib import Path
33
import pytest
4+
import logging
45
from pytest_mock import MockerFixture
56
from click.testing import Result
67
from sqlmesh.utils.errors import SQLMeshError
78
from sqlglot.errors import SqlglotError
9+
from tests.dbt.conftest import EmptyProjectCreator
810

911
pytestmark = pytest.mark.slow
1012

@@ -93,3 +95,15 @@ def test_run_error_handler(
9395
assert result.exit_code == 1
9496
assert "Error: Error with selector" in result.output
9597
assert "Traceback" not in result.output
98+
99+
100+
def test_log_level(invoke_cli: t.Callable[..., Result], create_empty_project: EmptyProjectCreator):
101+
create_empty_project()
102+
103+
result = invoke_cli(["--log-level", "info", "list"])
104+
assert result.exit_code == 0
105+
assert logging.getLogger("sqlmesh").getEffectiveLevel() == logging.INFO
106+
107+
result = invoke_cli(["--log-level", "debug", "list"])
108+
assert result.exit_code == 0
109+
assert logging.getLogger("sqlmesh").getEffectiveLevel() == logging.DEBUG

tests/dbt/cli/test_operations.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from sqlmesh.core.plan import PlanBuilder
1010
from sqlmesh.core.config.common import VirtualEnvironmentMode
1111
from tests.dbt.conftest import EmptyProjectCreator
12+
import logging
1213

1314
pytestmark = pytest.mark.slow
1415

@@ -363,3 +364,13 @@ def test_create_sets_concurrent_tasks_based_on_threads(create_empty_project: Emp
363364
g.connection and g.connection.concurrent_tasks == 16
364365
for g in operations.context.config.gateways.values()
365366
)
367+
368+
369+
def test_create_configures_log_level(create_empty_project: EmptyProjectCreator):
370+
project_dir, _ = create_empty_project()
371+
372+
create(project_dir=project_dir, log_level="info")
373+
assert logging.getLogger("sqlmesh").getEffectiveLevel() == logging.INFO
374+
375+
create(project_dir=project_dir, log_level="error")
376+
assert logging.getLogger("sqlmesh").getEffectiveLevel() == logging.ERROR

0 commit comments

Comments
 (0)