diff --git a/azure_functions_worker/dispatcher.py b/azure_functions_worker/dispatcher.py index e230a289d..cf177f930 100644 --- a/azure_functions_worker/dispatcher.py +++ b/azure_functions_worker/dispatcher.py @@ -24,20 +24,21 @@ from . import functions from . import loader from . import protos +from .bindings.shared_memory_data_transfer import SharedMemoryManager from .constants import (PYTHON_THREADPOOL_THREAD_COUNT, PYTHON_THREADPOOL_THREAD_COUNT_DEFAULT, PYTHON_THREADPOOL_THREAD_COUNT_MAX_37, PYTHON_THREADPOOL_THREAD_COUNT_MIN, PYTHON_ENABLE_DEBUG_LOGGING) +from .extension import ExtensionManager from .logging import disable_console_logging, enable_console_logging +from .logging import enable_debug_logging_recommendation from .logging import (logger, error_logger, is_system_log_category, CONSOLE_LOG_PREFIX) -from .extension import ExtensionManager from .utils.common import get_app_setting, is_envvar_true -from .utils.tracing import marshall_exception_trace from .utils.dependency import DependencyManager +from .utils.tracing import marshall_exception_trace from .utils.wrappers import disable_feature_by -from .bindings.shared_memory_data_transfer import SharedMemoryManager _TRUE = "true" @@ -262,6 +263,7 @@ async def _handle__worker_init_request(self, req): logger.info('Received WorkerInitRequest, ' 'python version %s, worker version %s, request ID %s', sys.version, __version__, self.request_id) + enable_debug_logging_recommendation() worker_init_request = req.worker_init_request host_capabilities = worker_init_request.capabilities @@ -459,6 +461,7 @@ async def _handle__function_environment_reload_request(self, req): try: logger.info('Received FunctionEnvironmentReloadRequest, ' 'request ID: %s', self.request_id) + enable_debug_logging_recommendation() func_env_reload_request = req.function_environment_reload_request diff --git a/azure_functions_worker/logging.py b/azure_functions_worker/logging.py index 01a4373a5..4f8fac2ea 100644 --- a/azure_functions_worker/logging.py +++ b/azure_functions_worker/logging.py @@ -76,6 +76,11 @@ def enable_console_logging() -> None: logger.addHandler(handler) +def enable_debug_logging_recommendation(): + logging.info("To enable debug level logging, please refer to " + "https://aka.ms/python-enable-debug-logging") + + def is_system_log_category(ctg: str) -> bool: """Check if the logging namespace belongs to system logs. Category starts with the following name will be treated as system logs. diff --git a/tests/unittests/test_dispatcher.py b/tests/unittests/test_dispatcher.py index 2d5960a1c..2b6c3bfa0 100644 --- a/tests/unittests/test_dispatcher.py +++ b/tests/unittests/test_dispatcher.py @@ -69,6 +69,36 @@ async def test_dispatcher_initialize_worker_logging(self): 1 ) + self.assertEqual( + len([l for l in r.logs if l.message.startswith( + 'To enable debug level logging' + )]), + 1 + ) + + async def test_dispatcher_environment_reload_logging(self): + """Test if the sync threadpool will pick up app setting in placeholder + mode (Linux Consumption) + """ + async with self._ctrl as host: + await self._check_if_function_is_ok(host) + + # Reload environment variable on specialization + r = await host.reload_environment(environment={}) + self.assertEqual( + len([l for l in r.logs if l.message.startswith( + 'Received FunctionEnvironmentReloadRequest' + )]), + 1 + ) + + self.assertEqual( + len([l for l in r.logs if l.message.startswith( + 'To enable debug level logging' + )]), + 1 + ) + async def test_dispatcher_send_worker_request(self): """Test if the worker status response will be sent correctly when a worker status request is received