Skip to content

Commit a85a8b2

Browse files
authored
Fix decouple logging from console (#3765)
1 parent 43303a0 commit a85a8b2

41 files changed

Lines changed: 390 additions & 180 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

sqlmesh/__init__.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ def format(self, record: logging.LogRecord) -> str:
136136

137137
def configure_logging(
138138
force_debug: bool = False,
139-
ignore_warnings: bool = False,
140139
write_to_stdout: bool = False,
141140
write_to_file: bool = True,
142141
log_limit: int = c.DEFAULT_LOG_LIMIT,
@@ -149,12 +148,11 @@ def configure_logging(
149148
level = logging.DEBUG if debug else logging.INFO
150149
logger.setLevel(level)
151150

152-
stdout_handler = logging.StreamHandler(sys.stdout)
153-
stdout_handler.setFormatter(CustomFormatter())
154-
stdout_handler.setLevel(
155-
level if write_to_stdout else (logging.ERROR if ignore_warnings else logging.WARNING)
156-
)
157-
logger.addHandler(stdout_handler)
151+
if write_to_stdout:
152+
stdout_handler = logging.StreamHandler(sys.stdout)
153+
stdout_handler.setFormatter(CustomFormatter())
154+
stdout_handler.setLevel(level)
155+
logger.addHandler(stdout_handler)
158156

159157
log_file_dir = log_file_dir or c.DEFAULT_LOG_FILE_DIR
160158
log_path_prefix = Path(log_file_dir) / LOG_FILENAME_PREFIX

sqlmesh/cli/main.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from sqlmesh.cli import options as opt
1313
from sqlmesh.cli.example_project import ProjectTemplate, init_example_project
1414
from sqlmesh.core.analytics import cli_analytics
15+
from sqlmesh.core.console import configure_console, get_console
1516
from sqlmesh.core.config import load_configs
1617
from sqlmesh.core.context import Context
1718
from sqlmesh.utils.date import TimeLike
@@ -91,9 +92,8 @@ def cli(
9192

9293
configs = load_configs(config, Context.CONFIG_TYPE, paths)
9394
log_limit = list(configs.values())[0].log_limit
94-
configure_logging(
95-
debug, ignore_warnings, log_to_stdout, log_limit=log_limit, log_file_dir=log_file_dir
96-
)
95+
configure_logging(debug, log_to_stdout, log_limit=log_limit, log_file_dir=log_file_dir)
96+
configure_console(ignore_warnings=ignore_warnings)
9797

9898
try:
9999
context = Context(
@@ -433,7 +433,7 @@ def plan(
433433
select_models = kwargs.pop("select_model") or None
434434
allow_destructive_models = kwargs.pop("allow_destructive_model") or None
435435
backfill_models = kwargs.pop("backfill_model") or None
436-
context.console.verbose = verbose
436+
setattr(get_console(), "verbose", verbose)
437437
context.plan(
438438
environment,
439439
restate_models=restate_models,

sqlmesh/core/config/connection.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1776,7 +1776,7 @@ def _connection_config_validator(
17761776
return parse_connection_config(v)
17771777

17781778

1779-
connection_config_validator = field_validator(
1779+
connection_config_validator: t.Callable = field_validator(
17801780
"connection",
17811781
"state_connection",
17821782
"test_connection",

sqlmesh/core/config/root.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import re
55
import typing as t
66
import zlib
7-
import logging
87

98
from pydantic import Field
109
from sqlglot import exp
@@ -13,6 +12,7 @@
1312

1413
from sqlmesh.cicd.config import CICDBotConfig
1514
from sqlmesh.core import constants as c
15+
from sqlmesh.core.console import get_console
1616
from sqlmesh.core.config import EnvironmentSuffixTarget
1717
from sqlmesh.core.config.base import BaseConfig, UpdateStrategy
1818
from sqlmesh.core.config.common import variables_validator, compile_regex_mapping
@@ -45,8 +45,6 @@
4545
if t.TYPE_CHECKING:
4646
from sqlmesh.core._typing import Self
4747

48-
logger = logging.getLogger(__name__)
49-
5048

5149
class Config(BaseConfig):
5250
"""An object used by a Context to configure your SQLMesh project.
@@ -175,13 +173,13 @@ def _normalize_and_validate_fields(cls, data: t.Any) -> t.Any:
175173
)
176174

177175
if "physical_schema_override" in data:
178-
logger.warning(
179-
"`physical_schema_override` is deprecated. Please use `physical_schema_mapping` instead"
176+
get_console().log_warning(
177+
"`physical_schema_override` is deprecated. Please use `physical_schema_mapping` instead."
180178
)
181179

182180
if "physical_schema_mapping" in data:
183181
raise ConfigError(
184-
"Only one of `physical_schema_override` and `physical_schema_mapping` can be specified"
182+
"Only one of `physical_schema_override` and `physical_schema_mapping` can be specified."
185183
)
186184

187185
physical_schema_override: t.Dict[str, str] = data.pop("physical_schema_override")

sqlmesh/core/config/scheduler.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import annotations
22

33
import abc
4-
import logging
54
import typing as t
65

76
from pydantic import Field
@@ -10,7 +9,7 @@
109
from sqlglot.helper import subclasses
1110
from sqlmesh.core.config.base import BaseConfig
1211
from sqlmesh.core.config.common import concurrent_tasks_validator
13-
from sqlmesh.core.console import Console
12+
from sqlmesh.core.console import Console, get_console
1413
from sqlmesh.core.plan import (
1514
AirflowPlanEvaluator,
1615
BuiltInPlanEvaluator,
@@ -32,8 +31,6 @@
3231

3332
from sqlmesh.utils.config import sensitive_fields, excluded_fields
3433

35-
logger = logging.getLogger(__name__)
36-
3734

3835
class SchedulerConfig(abc.ABC):
3936
"""Abstract base class for Scheduler configurations."""
@@ -88,10 +85,10 @@ def create_state_sync(self, context: GenericContext) -> StateSync:
8885
):
8986
# If we are using DuckDB, ensure that multithreaded mode gets enabled if necessary
9087
if warehouse_connection.concurrent_tasks > 1:
91-
logger.warning(
88+
get_console().log_warning(
9289
"The duckdb state connection is configured for single threaded mode but the warehouse connection is configured for "
9390
+ f"multi threaded mode with {warehouse_connection.concurrent_tasks} concurrent tasks."
94-
+ " This can cause SQLMesh to hang. Overriding the duckdb state connection config to use multi threaded mode"
91+
+ " This can cause SQLMesh to hang. Overriding the duckdb state connection config to use multi threaded mode."
9592
)
9693
# this triggers multithreaded mode and has to happen before the engine adapter is created below
9794
state_connection.concurrent_tasks = warehouse_connection.concurrent_tasks
@@ -109,7 +106,7 @@ def create_state_sync(self, context: GenericContext) -> StateSync:
109106
warehouse_connection, DuckDBConnectionConfig
110107
):
111108
if not state_connection.is_recommended_for_state_sync:
112-
logger.warning(
109+
get_console().log_warning(
113110
f"The {state_connection.type_} engine is not recommended for storing SQLMesh state in production deployments. Please see"
114111
+ " https://sqlmesh.readthedocs.io/en/stable/guides/configuration/#state-connection for a list of recommended engines and more information."
115112
)
@@ -205,7 +202,7 @@ def get_default_catalog(self, context: GenericContext) -> t.Optional[str]:
205202

206203

207204
def _max_snapshot_ids_per_request_validator(v: t.Any) -> t.Optional[int]:
208-
logger.warning(
205+
get_console().log_warning(
209206
"The `max_snapshot_ids_per_request` field is deprecated and will be removed in a future release."
210207
)
211208
return None

0 commit comments

Comments
 (0)