From 9f4740d385616e785bd3e245bfd45c81a7bcc283 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Tue, 18 Mar 2025 11:32:37 +0100 Subject: [PATCH 1/3] Handle loguru msg levels that are not supported by Sentry --- sentry_sdk/integrations/loguru.py | 32 +++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/integrations/loguru.py b/sentry_sdk/integrations/loguru.py index da99dfc4d6..745c91f742 100644 --- a/sentry_sdk/integrations/loguru.py +++ b/sentry_sdk/integrations/loguru.py @@ -31,6 +31,16 @@ class LoggingLevels(enum.IntEnum): CRITICAL = 50 +SENTRY_LEVEL_FROM_LOGURU_LEVEL = { + "TRACE": "DEBUG", + "DEBUG": "DEBUG", + "INFO": "INFO", + "SUCCESS": "INFO", + "WARNING": "WARNING", + "ERROR": "ERROR", + "CRITICAL": "CRITICAL", +} + DEFAULT_LEVEL = LoggingLevels.INFO.value DEFAULT_EVENT_LEVEL = LoggingLevels.ERROR.value # We need to save the handlers to be able to remove them later @@ -87,14 +97,32 @@ class _LoguruBaseHandler(_BaseHandler): def _logging_to_event_level(self, record): # type: (LogRecord) -> str try: - return LoggingLevels(record.levelno).name.lower() - except ValueError: + return SENTRY_LEVEL_FROM_LOGURU_LEVEL[ + LoggingLevels(record.levelno).name + ].lower() + except (ValueError, KeyError): return record.levelname.lower() if record.levelname else "" class LoguruEventHandler(_LoguruBaseHandler, EventHandler): """Modified version of :class:`sentry_sdk.integrations.logging.EventHandler` to use loguru's level names.""" + def __init__(self, *args, **kwargs): + if kwargs.get("level"): + kwargs["level"] = SENTRY_LEVEL_FROM_LOGURU_LEVEL.get( + kwargs.get("level"), DEFAULT_LEVEL + ) + + super().__init__(*args, **kwargs) + class LoguruBreadcrumbHandler(_LoguruBaseHandler, BreadcrumbHandler): """Modified version of :class:`sentry_sdk.integrations.logging.BreadcrumbHandler` to use loguru's level names.""" + + def __init__(self, *args, **kwargs): + if kwargs.get("level"): + kwargs["level"] = SENTRY_LEVEL_FROM_LOGURU_LEVEL.get( + kwargs.get("level"), DEFAULT_LEVEL + ) + + super().__init__(*args, **kwargs) From cafd1783d1dde56214817260979a44de6893b7b2 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Wed, 19 Mar 2025 08:14:44 +0100 Subject: [PATCH 2/3] Updated tests --- tests/integrations/loguru/test_loguru.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/tests/integrations/loguru/test_loguru.py b/tests/integrations/loguru/test_loguru.py index 6030108de1..64e9f22ba5 100644 --- a/tests/integrations/loguru/test_loguru.py +++ b/tests/integrations/loguru/test_loguru.py @@ -8,18 +8,18 @@ @pytest.mark.parametrize( - "level,created_event", + "level,created_event,expected_sentry_level", [ # None - no breadcrumb # False - no event # True - event created - (LoggingLevels.TRACE, None), - (LoggingLevels.DEBUG, None), - (LoggingLevels.INFO, False), - (LoggingLevels.SUCCESS, False), - (LoggingLevels.WARNING, False), - (LoggingLevels.ERROR, True), - (LoggingLevels.CRITICAL, True), + (LoggingLevels.TRACE, None, "debug"), + (LoggingLevels.DEBUG, None, "debug"), + (LoggingLevels.INFO, False, "info"), + (LoggingLevels.SUCCESS, False, "info"), + (LoggingLevels.WARNING, False, "warning"), + (LoggingLevels.ERROR, True, "error"), + (LoggingLevels.CRITICAL, True, "critical"), ], ) @pytest.mark.parametrize("disable_breadcrumbs", [True, False]) @@ -29,6 +29,7 @@ def test_just_log( capture_events, level, created_event, + expected_sentry_level, disable_breadcrumbs, disable_events, ): @@ -48,7 +49,7 @@ def test_just_log( formatted_message = ( " | " + "{:9}".format(level.name.upper()) - + "| tests.integrations.loguru.test_loguru:test_just_log:46 - test" + + "| tests.integrations.loguru.test_loguru:test_just_log:47 - test" ) if not created_event: @@ -59,7 +60,7 @@ def test_just_log( not disable_breadcrumbs and created_event is not None ): # not None == not TRACE or DEBUG level (breadcrumb,) = breadcrumbs - assert breadcrumb["level"] == level.name.lower() + assert breadcrumb["level"] == expected_sentry_level assert breadcrumb["category"] == "tests.integrations.loguru.test_loguru" assert breadcrumb["message"][23:] == formatted_message else: @@ -72,7 +73,7 @@ def test_just_log( return (event,) = events - assert event["level"] == (level.name.lower()) + assert event["level"] == expected_sentry_level assert event["logger"] == "tests.integrations.loguru.test_loguru" assert event["logentry"]["message"][23:] == formatted_message From 0c530cdbc0286aa6e6f1c61c2a3a494dd919a843 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Wed, 19 Mar 2025 08:20:34 +0100 Subject: [PATCH 3/3] linting --- sentry_sdk/integrations/loguru.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sentry_sdk/integrations/loguru.py b/sentry_sdk/integrations/loguru.py index 745c91f742..5b76ea812a 100644 --- a/sentry_sdk/integrations/loguru.py +++ b/sentry_sdk/integrations/loguru.py @@ -11,7 +11,7 @@ if TYPE_CHECKING: from logging import LogRecord - from typing import Optional, Tuple + from typing import Optional, Tuple, Any try: import loguru @@ -108,9 +108,10 @@ class LoguruEventHandler(_LoguruBaseHandler, EventHandler): """Modified version of :class:`sentry_sdk.integrations.logging.EventHandler` to use loguru's level names.""" def __init__(self, *args, **kwargs): + # type: (*Any, **Any) -> None if kwargs.get("level"): kwargs["level"] = SENTRY_LEVEL_FROM_LOGURU_LEVEL.get( - kwargs.get("level"), DEFAULT_LEVEL + kwargs.get("level", ""), DEFAULT_LEVEL ) super().__init__(*args, **kwargs) @@ -120,9 +121,10 @@ class LoguruBreadcrumbHandler(_LoguruBaseHandler, BreadcrumbHandler): """Modified version of :class:`sentry_sdk.integrations.logging.BreadcrumbHandler` to use loguru's level names.""" def __init__(self, *args, **kwargs): + # type: (*Any, **Any) -> None if kwargs.get("level"): kwargs["level"] = SENTRY_LEVEL_FROM_LOGURU_LEVEL.get( - kwargs.get("level"), DEFAULT_LEVEL + kwargs.get("level", ""), DEFAULT_LEVEL ) super().__init__(*args, **kwargs)