From f0fa2d616492096157c626a9479037495d865fa9 Mon Sep 17 00:00:00 2001 From: Kevin Zheng Date: Fri, 15 Dec 2023 16:46:41 +0000 Subject: [PATCH 1/2] fix: Allowed for a partial override of loggers that get excluded from setup_client --- google/cloud/logging_v2/handlers/handlers.py | 12 ++++--- tests/unit/handlers/test_handlers.py | 34 +++++++++++++++++++- tests/unit/test_client.py | 6 ---- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/google/cloud/logging_v2/handlers/handlers.py b/google/cloud/logging_v2/handlers/handlers.py index ce5822fcd..34bb018d8 100644 --- a/google/cloud/logging_v2/handlers/handlers.py +++ b/google/cloud/logging_v2/handlers/handlers.py @@ -24,13 +24,17 @@ DEFAULT_LOGGER_NAME = "python" -"""Exclude internal logs from propagating through handlers""" +"""Defaults for filtering out noisy loggers""" EXCLUDED_LOGGER_DEFAULTS = ( + "google.api_core.bidi", + "werkzeug", +) + +"""Exclude internal logs from propagating through handlers""" +_INTERNAL_LOGGERS = ( "google.cloud", "google.auth", "google_auth_httplib2", - "google.api_core.bidi", - "werkzeug", ) """These environments require us to remove extra handlers on setup""" @@ -291,7 +295,7 @@ def setup_logging( log_level (Optional[int]): Python logging log level. Defaults to :const:`logging.INFO`. """ - all_excluded_loggers = set(excluded_loggers + EXCLUDED_LOGGER_DEFAULTS) + all_excluded_loggers = set(excluded_loggers + _INTERNAL_LOGGERS) logger = logging.getLogger() # remove built-in handlers on App Engine or Cloud Functions environments diff --git a/tests/unit/handlers/test_handlers.py b/tests/unit/handlers/test_handlers.py index 1f86a8e37..52dacb3cc 100644 --- a/tests/unit/handlers/test_handlers.py +++ b/tests/unit/handlers/test_handlers.py @@ -18,6 +18,11 @@ import mock import json +from google.cloud.logging_v2.handlers.handlers import ( + _INTERNAL_LOGGERS, + EXCLUDED_LOGGER_DEFAULTS, +) + from google.cloud.logging_v2.handlers._monitored_resources import ( _FUNCTION_ENV_VARS, _GAE_ENV_VARS, @@ -867,7 +872,7 @@ class TestSetupLogging(unittest.TestCase): def _call_fut(self, handler, excludes=None): from google.cloud.logging.handlers import setup_logging - if excludes: + if excludes is not None: return setup_logging(handler, excluded_loggers=excludes) else: return setup_logging(handler) @@ -892,6 +897,24 @@ def test_setup_logging_excludes(self): excluded_logger = logging.getLogger(EXCLUDED_LOGGER_NAME) self.assertNotIn(handler, excluded_logger.handlers) self.assertFalse(excluded_logger.propagate) + + def test_setup_logging_internal_loggers_no_excludes(self): + handler = _Handler(logging.INFO) + self._call_fut(handler, excludes=()) + + # Test that excluded logger defaults can be included, but internal + # loggers can't be. + for logger_name in _INTERNAL_LOGGERS: + logger = logging.getLogger(logger_name) + self.assertNotIn(handler, logger.handlers) + self.assertFalse(logger.propagate) + + logger = logging.getLogger("logging") + self.assertTrue(logger.propagate) + + for logger_name in EXCLUDED_LOGGER_DEFAULTS: + logger = logging.getLogger(logger_name) + self.assertTrue(logger.propagate) @patch.dict("os.environ", {envar: "1" for envar in _FUNCTION_ENV_VARS}) def test_remove_handlers_gcf(self): @@ -939,10 +962,19 @@ def test_keep_handlers_others(self): def setUp(self): self._handlers_cache = logging.getLogger().handlers[:] + # reset the logging manager every time so that we're not reusing loggers + # across different test cases. + self._logger_manager = logging.Logger.manager + logging.Logger.manager = logging.Manager(logging.Logger.root) + def tearDown(self): # cleanup handlers logging.getLogger().handlers = self._handlers_cache[:] + # restore the old logging manager. + logging.Logger.manager = self._logger_manager + + class _Handler(object): def __init__(self, level): diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index ec3130ac5..2f6736dcf 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -847,9 +847,6 @@ def test_setup_logging(self): expected_kwargs = { "excluded_loggers": ( - "google.cloud", - "google.auth", - "google_auth_httplib2", "google.api_core.bidi", "werkzeug", ), @@ -890,9 +887,6 @@ def test_setup_logging_w_extra_kwargs(self): expected_kwargs = { "excluded_loggers": ( - "google.cloud", - "google.auth", - "google_auth_httplib2", "google.api_core.bidi", "werkzeug", ), From 60a3bf138961cf32d4fb5243642fad1904f6e5b5 Mon Sep 17 00:00:00 2001 From: Owl Bot Date: Fri, 15 Dec 2023 16:54:55 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=A6=89=20Updates=20from=20OwlBot=20po?= =?UTF-8?q?st-processor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --- tests/unit/handlers/test_handlers.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/unit/handlers/test_handlers.py b/tests/unit/handlers/test_handlers.py index 52dacb3cc..c301327a9 100644 --- a/tests/unit/handlers/test_handlers.py +++ b/tests/unit/handlers/test_handlers.py @@ -897,7 +897,7 @@ def test_setup_logging_excludes(self): excluded_logger = logging.getLogger(EXCLUDED_LOGGER_NAME) self.assertNotIn(handler, excluded_logger.handlers) self.assertFalse(excluded_logger.propagate) - + def test_setup_logging_internal_loggers_no_excludes(self): handler = _Handler(logging.INFO) self._call_fut(handler, excludes=()) @@ -908,10 +908,10 @@ def test_setup_logging_internal_loggers_no_excludes(self): logger = logging.getLogger(logger_name) self.assertNotIn(handler, logger.handlers) self.assertFalse(logger.propagate) - + logger = logging.getLogger("logging") self.assertTrue(logger.propagate) - + for logger_name in EXCLUDED_LOGGER_DEFAULTS: logger = logging.getLogger(logger_name) self.assertTrue(logger.propagate) @@ -975,7 +975,6 @@ def tearDown(self): logging.Logger.manager = self._logger_manager - class _Handler(object): def __init__(self, level): self.level = level