From ded64a55df1e851aaae7c9e7b4406a2e4cd57a23 Mon Sep 17 00:00:00 2001 From: Daniel Standish <15932138+dstandish@users.noreply.github.com> Date: Fri, 25 Mar 2022 17:00:42 -0700 Subject: [PATCH] Reduce verbosity of provider import failure logs & make configurable When running airflow from sources we might not have all deps installed so provider imports fail. Currently the traceback is logged at warning level which is too much; it obliterates your history. Instead we make optional the simple reporting of an import failure in a provider, and additionally we move the traceback to DEBUG only (not configurable). --- airflow/config_templates/config.yml | 9 +++++++++ airflow/config_templates/default_airflow.cfg | 5 +++++ airflow/providers_manager.py | 15 +++++++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/airflow/config_templates/config.yml b/airflow/config_templates/config.yml index dafdeae693077..9b24d13bccf19 100644 --- a/airflow/config_templates/config.yml +++ b/airflow/config_templates/config.yml @@ -539,6 +539,15 @@ type: string example: ~ default: "INFO" + - name: provider_import_error_level + description: | + Logging level for provider import failures. Intended mainly for Airflow developers. + + Supported values: ``CRITICAL``, ``ERROR``, ``WARNING``, ``INFO``, ``DEBUG``. + version_added: 2.3.0 + type: string + example: ~ + default: ~ - name: celery_logging_level description: | Logging level for celery. If not set, it uses the value of logging_level diff --git a/airflow/config_templates/default_airflow.cfg b/airflow/config_templates/default_airflow.cfg index 3921d88a2f5f0..c37b7d70cf0be 100644 --- a/airflow/config_templates/default_airflow.cfg +++ b/airflow/config_templates/default_airflow.cfg @@ -306,6 +306,11 @@ encrypt_s3_logs = False # Supported values: ``CRITICAL``, ``ERROR``, ``WARNING``, ``INFO``, ``DEBUG``. logging_level = INFO +# Logging level for provider import failures. Intended mainly for Airflow developers. +# +# Supported values: ``CRITICAL``, ``ERROR``, ``WARNING``, ``INFO``, ``DEBUG``. +# provider_import_error_level = + # Logging level for celery. If not set, it uses the value of logging_level # # Supported values: ``CRITICAL``, ``ERROR``, ``WARNING``, ``INFO``, ``DEBUG``. diff --git a/airflow/providers_manager.py b/airflow/providers_manager.py index a36b592d37d23..4188413f8b418 100644 --- a/airflow/providers_manager.py +++ b/airflow/providers_manager.py @@ -46,6 +46,7 @@ from airflow.exceptions import AirflowOptionalProviderFeatureException from airflow.hooks.base import BaseHook +from airflow.settings import conf from airflow.utils import yaml from airflow.utils.entry_points import entry_points_with_dist from airflow.utils.log.logging_mixin import LoggingMixin @@ -62,6 +63,10 @@ "apache-airflow-providers-celery": "2.1.0", } +PROVIDER_IMPORT_ERROR_LEVEL = logging.getLevelName( + conf.get('logging', 'provider_import_error_level', fallback='WARNING').upper() +) + class LazyDictWithCache(MutableMapping): """ @@ -168,8 +173,14 @@ def _sanity_check(provider_package: str, class_name: str) -> Optional[Type[BaseH except ImportError as e: # When there is an ImportError we turn it into debug warnings as this is # an expected case when only some providers are installed - log.warning( - "Exception when importing '%s' from '%s' package", + log.log( + PROVIDER_IMPORT_ERROR_LEVEL, + "Exception when importing '%s' from '%s' package. Set log level to DEBUG for traceback.", + class_name, + provider_package, + ) + log.debug( + "Traceback from failed import of class %r from package %r", class_name, provider_package, exc_info=e,