diff --git a/docs/includes/settingref.txt b/docs/includes/settingref.txt index 91bec6c02..f1c69a597 100644 --- a/docs/includes/settingref.txt +++ b/docs/includes/settingref.txt @@ -2135,6 +2135,21 @@ Level used when redirecting standard outputs. The logging level to use when redirect STDOUT/STDERR to logging. +.. setting:: worker_override_logging + +``worker_override_logging`` +--------------------------- + +:type: :class:`bool` +:default: :const:`True` +:environment: :envvar:`WORKER_OVERRIDE_LOGGING` + +Override worker logging. + +Enable to configure root logger. + +Enabled by default. + .. _settings-extending: diff --git a/faust/cli/base.py b/faust/cli/base.py index 8e57b6485..59c601c09 100644 --- a/faust/cli/base.py +++ b/faust/cli/base.py @@ -516,6 +516,7 @@ class Command(abc.ABC): # noqa: B024 daemon: bool = False redirect_stdouts: Optional[bool] = None redirect_stdouts_level: Optional[int] = None + override_logging: Optional[bool] = None builtin_options: OptionSequence = builtin_options options: Optional[OptionList] = None @@ -660,6 +661,7 @@ def worker_for_service( console_port=self.console_port, redirect_stdouts=self.redirect_stdouts or False, redirect_stdouts_level=self.redirect_stdouts_level, + override_logging=self.override_logging or False, loop=loop or asyncio.get_event_loop_policy().get_event_loop(), daemon=self.daemon, ) diff --git a/faust/types/settings/settings.py b/faust/types/settings/settings.py index 2fbc84d17..29a463caf 100644 --- a/faust/types/settings/settings.py +++ b/faust/types/settings/settings.py @@ -168,6 +168,7 @@ def __init__( # Worker settings: worker_redirect_stdouts: Optional[bool] = None, worker_redirect_stdouts_level: Severity = None, + worker_override_logging: Optional[bool] = None, # Extension settings: Agent: SymbolArg[Type[AgentT]] = None, ConsumerScheduler: SymbolArg[Type[SchedulingStrategyT]] = None, @@ -2023,6 +2024,19 @@ def worker_redirect_stdouts_level(self) -> Severity: The logging level to use when redirect STDOUT/STDERR to logging. """ + @sections.Worker.setting( + params.Bool, + env_name="WORKER_OVERRIDE_LOGGING", + default=True, + ) + def worker_override_logging(self) -> bool: + """Override worker logging. + + Enable to configure root logger. + + Enabled by default. + """ + @sections.Extension.setting( params.Symbol(Type[AgentT]), default="faust:Agent", diff --git a/faust/worker.py b/faust/worker.py index 06533b77e..819b9e089 100644 --- a/faust/worker.py +++ b/faust/worker.py @@ -229,6 +229,7 @@ def __init__( loop: Optional[asyncio.AbstractEventLoop] = None, redirect_stdouts: Optional[bool] = None, redirect_stdouts_level: Optional[Severity] = None, + override_logging: Optional[bool] = None, logging_config: Optional[Dict] = None, **kwargs: Any, ) -> None: @@ -240,6 +241,8 @@ def __init__( redirect_stdouts = conf.worker_redirect_stdouts if redirect_stdouts_level is None: redirect_stdouts_level = conf.worker_redirect_stdouts_level or logging.INFO + if override_logging is None: + override_logging = conf.worker_override_logging if logging_config is None and app.conf.logging_config: logging_config = dict(app.conf.logging_config) super().__init__( @@ -255,6 +258,7 @@ def __init__( console_port=console_port, redirect_stdouts=redirect_stdouts, redirect_stdouts_level=redirect_stdouts_level, + override_logging=override_logging, logging_config=logging_config, loop=loop, **kwargs, diff --git a/tests/functional/test_app.py b/tests/functional/test_app.py index 94ebe8b86..ed11d8184 100644 --- a/tests/functional/test_app.py +++ b/tests/functional/test_app.py @@ -444,6 +444,11 @@ def test_env_with_prefix(self): setting=Settings.worker_redirect_stdouts_level, expected_value="error", ), + EnvCase( + env={"WORKER_OVERRIDE_LOGGING": "no"}, + setting=Settings.worker_override_logging, + expected_value=False, + ), ], ) def test_env(self, env, setting, expected_value): @@ -555,6 +560,7 @@ def test_defaults(self): assert conf.web_cors_options is None assert conf.worker_redirect_stdouts assert conf.worker_redirect_stdouts_level == "WARN" + assert conf.worker_override_logging assert conf.agent_supervisor is mode.OneForOneSupervisor @@ -677,6 +683,7 @@ def assert_config_equivalent( }, worker_redirect_stdouts=False, worker_redirect_stdouts_level="DEBUG", + worker_override_logging=False, broker_max_poll_records=1000, broker_max_poll_interval=10000, timezone=pytz.timezone("US/Eastern"), # noqa: B008 @@ -745,6 +752,7 @@ def assert_config_equivalent( web_cors_options=web_cors_options, worker_redirect_stdouts=worker_redirect_stdouts, worker_redirect_stdouts_level=worker_redirect_stdouts_level, + worker_override_logging=worker_override_logging, logging_config=logging_config, consumer_auto_offset_reset=consumer_auto_offset_reset, ConsumerScheduler=ConsumerScheduler, @@ -809,6 +817,7 @@ def assert_config_equivalent( assert conf.web_cors_options == web_cors_options assert conf.worker_redirect_stdouts == worker_redirect_stdouts assert conf.worker_redirect_stdouts_level == worker_redirect_stdouts_level + assert conf.worker_override_logging == worker_override_logging assert conf.broker_max_poll_records == broker_max_poll_records assert conf.broker_max_poll_interval == broker_max_poll_interval assert conf.logging_config == logging_config diff --git a/tests/unit/cli/test_base.py b/tests/unit/cli/test_base.py index 5fd3aeab0..c1e437914 100644 --- a/tests/unit/cli/test_base.py +++ b/tests/unit/cli/test_base.py @@ -366,6 +366,7 @@ def test_worker_for_service(self, *, command): console_port=command.console_port, redirect_stdouts=command.redirect_stdouts or False, redirect_stdouts_level=command.redirect_stdouts_level, + override_logging=command.override_logging or False, loop=loop, daemon=command.daemon, ) diff --git a/tests/unit/test_worker.py b/tests/unit/test_worker.py index 541dd1121..38ab77ad7 100644 --- a/tests/unit/test_worker.py +++ b/tests/unit/test_worker.py @@ -38,8 +38,10 @@ def test_constructor(self, app): assert not w2.redirect_stdouts w3 = Worker(app, redirect_stdouts_level="DEBUG") assert w3.redirect_stdouts_level == 10 - w4 = Worker(app, logging_config={"foo": 1}) - assert w4.logging_config == {"foo": 1} + w4 = Worker(app, override_logging=False) + assert not w4.override_logging + w5 = Worker(app, logging_config={"foo": 1}) + assert w5.logging_config == {"foo": 1} def test_set_sensors(self, app): assert Worker(app, sensors=[1, 2]).sensors == {1, 2}