Skip to content

Commit 830f270

Browse files
authored
fix(loguru): Move integration setup from __init__ to setup_once (#4399)
We shouldn't have setup code in an integration's `__init__`. This can be called an arbitrary amount of times. `setup_once` exists so that the code is only guaranteed to run once. Having integration setup in `__init__` also means that the integration currently can't be disabled via `disabled_integrations`. Fixes #4398
1 parent f572757 commit 830f270

File tree

2 files changed

+37
-35
lines changed

2 files changed

+37
-35
lines changed

sentry_sdk/integrations/loguru.py

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
if TYPE_CHECKING:
1313
from logging import LogRecord
14-
from typing import Optional, Tuple, Any
14+
from typing import Optional, Any
1515

1616
try:
1717
import loguru
@@ -43,16 +43,16 @@ class LoggingLevels(enum.IntEnum):
4343

4444
DEFAULT_LEVEL = LoggingLevels.INFO.value
4545
DEFAULT_EVENT_LEVEL = LoggingLevels.ERROR.value
46-
# We need to save the handlers to be able to remove them later
47-
# in tests (they call `LoguruIntegration.__init__` multiple times,
48-
# and we can't use `setup_once` because it's called before
49-
# than we get configuration).
50-
_ADDED_HANDLERS = (None, None) # type: Tuple[Optional[int], Optional[int]]
5146

5247

5348
class LoguruIntegration(Integration):
5449
identifier = "loguru"
5550

51+
level = DEFAULT_LEVEL # type: Optional[int]
52+
event_level = DEFAULT_EVENT_LEVEL # type: Optional[int]
53+
breadcrumb_format = DEFAULT_FORMAT
54+
event_format = DEFAULT_FORMAT
55+
5656
def __init__(
5757
self,
5858
level=DEFAULT_LEVEL,
@@ -61,36 +61,27 @@ def __init__(
6161
event_format=DEFAULT_FORMAT,
6262
):
6363
# type: (Optional[int], Optional[int], str | loguru.FormatFunction, str | loguru.FormatFunction) -> None
64-
global _ADDED_HANDLERS
65-
breadcrumb_handler, event_handler = _ADDED_HANDLERS
66-
67-
if breadcrumb_handler is not None:
68-
logger.remove(breadcrumb_handler)
69-
breadcrumb_handler = None
70-
if event_handler is not None:
71-
logger.remove(event_handler)
72-
event_handler = None
73-
74-
if level is not None:
75-
breadcrumb_handler = logger.add(
76-
LoguruBreadcrumbHandler(level=level),
77-
level=level,
78-
format=breadcrumb_format,
79-
)
80-
81-
if event_level is not None:
82-
event_handler = logger.add(
83-
LoguruEventHandler(level=event_level),
84-
level=event_level,
85-
format=event_format,
86-
)
87-
88-
_ADDED_HANDLERS = (breadcrumb_handler, event_handler)
64+
LoguruIntegration.level = level
65+
LoguruIntegration.event_level = event_level
66+
LoguruIntegration.breadcrumb_format = breadcrumb_format
67+
LoguruIntegration.event_format = event_format
8968

9069
@staticmethod
9170
def setup_once():
9271
# type: () -> None
93-
pass # we do everything in __init__
72+
if LoguruIntegration.level is not None:
73+
logger.add(
74+
LoguruBreadcrumbHandler(level=LoguruIntegration.level),
75+
level=LoguruIntegration.level,
76+
format=LoguruIntegration.breadcrumb_format,
77+
)
78+
79+
if LoguruIntegration.event_level is not None:
80+
logger.add(
81+
LoguruEventHandler(level=LoguruIntegration.event_level),
82+
level=LoguruIntegration.event_level,
83+
format=LoguruIntegration.event_format,
84+
)
9485

9586

9687
class _LoguruBaseHandler(_BaseHandler):

tests/integrations/loguru/test_loguru.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,12 @@ def test_just_log(
3232
expected_sentry_level,
3333
disable_breadcrumbs,
3434
disable_events,
35+
uninstall_integration,
36+
request,
3537
):
38+
uninstall_integration("loguru")
39+
request.addfinalizer(logger.remove)
40+
3641
sentry_init(
3742
integrations=[
3843
LoguruIntegration(
@@ -49,7 +54,7 @@ def test_just_log(
4954
formatted_message = (
5055
" | "
5156
+ "{:9}".format(level.name.upper())
52-
+ "| tests.integrations.loguru.test_loguru:test_just_log:47 - test"
57+
+ "| tests.integrations.loguru.test_loguru:test_just_log:52 - test"
5358
)
5459

5560
if not created_event:
@@ -78,7 +83,10 @@ def test_just_log(
7883
assert event["logentry"]["message"][23:] == formatted_message
7984

8085

81-
def test_breadcrumb_format(sentry_init, capture_events):
86+
def test_breadcrumb_format(sentry_init, capture_events, uninstall_integration, request):
87+
uninstall_integration("loguru")
88+
request.addfinalizer(logger.remove)
89+
8290
sentry_init(
8391
integrations=[
8492
LoguruIntegration(
@@ -98,7 +106,10 @@ def test_breadcrumb_format(sentry_init, capture_events):
98106
assert breadcrumb["message"] == formatted_message
99107

100108

101-
def test_event_format(sentry_init, capture_events):
109+
def test_event_format(sentry_init, capture_events, uninstall_integration, request):
110+
uninstall_integration("loguru")
111+
request.addfinalizer(logger.remove)
112+
102113
sentry_init(
103114
integrations=[
104115
LoguruIntegration(

0 commit comments

Comments
 (0)