Skip to content

Commit 658f022

Browse files
authored
feat: Split up loggers (#134)
* feat: Split up loggers * ref: Rename SentryHandler, make event_level independent
1 parent 8e5924d commit 658f022

File tree

1 file changed

+72
-50
lines changed

1 file changed

+72
-50
lines changed

sentry_sdk/integrations/logging.py

Lines changed: 72 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,24 @@ class LoggingIntegration(Integration):
2929
identifier = "logging"
3030

3131
def __init__(self, level=DEFAULT_LEVEL, event_level=DEFAULT_EVENT_LEVEL):
32-
self._handler = SentryHandler(level=level, event_level=event_level)
32+
self._handler = None
33+
self._breadcrumb_handler = None
34+
35+
if level is not None:
36+
self._breadcrumb_handler = BreadcrumbHandler(level=level)
37+
38+
if event_level is not None:
39+
self._handler = EventHandler(level=event_level)
40+
41+
def _handle_record(self, record):
42+
if self._handler is not None and record.levelno >= self._handler.level:
43+
self._handler.handle(record)
44+
45+
if (
46+
self._breadcrumb_handler is not None
47+
and record.levelno >= self._breadcrumb_handler.level
48+
):
49+
self._breadcrumb_handler.handle(record)
3350

3451
@staticmethod
3552
def setup_once():
@@ -43,75 +60,80 @@ def sentry_patched_callhandlers(self, record):
4360
if record.name not in _IGNORED_LOGGERS:
4461
integration = Hub.current.get_integration(LoggingIntegration)
4562
if integration is not None:
46-
integration._handler.handle(record)
63+
integration._handle_record(record)
4764
return old_callhandlers(self, record)
4865

4966
logging.Logger.callHandlers = sentry_patched_callhandlers
5067

5168

52-
class SentryHandler(logging.Handler, object):
53-
def __init__(self, level=DEFAULT_LEVEL, event_level=DEFAULT_EVENT_LEVEL, **kwargs):
54-
logging.Handler.__init__(self, level, **kwargs)
55-
if event_level is None:
56-
self._event_level = None
57-
else:
58-
self._event_level = logging._checkLevel(event_level)
69+
def _can_record(record):
70+
return record.name not in _IGNORED_LOGGERS
71+
72+
73+
def _breadcrumb_from_record(record):
74+
return {
75+
"ty": "log",
76+
"level": _logging_to_event_level(record.levelname),
77+
"category": record.name,
78+
"message": record.message,
79+
"timestamp": datetime.datetime.fromtimestamp(record.created),
80+
}
81+
5982

83+
def _logging_to_event_level(levelname):
84+
return {"critical": "fatal"}.get(levelname.lower(), levelname.lower())
85+
86+
87+
class EventHandler(logging.Handler, object):
6088
def emit(self, record):
6189
with capture_internal_exceptions():
6290
self.format(record)
6391
return self._emit(record)
6492

65-
def can_record(self, record):
66-
return record.name not in _IGNORED_LOGGERS
67-
68-
def _breadcrumb_from_record(self, record):
69-
return {
70-
"ty": "log",
71-
"level": self._logging_to_event_level(record.levelname),
72-
"category": record.name,
73-
"message": record.message,
74-
"timestamp": datetime.datetime.fromtimestamp(record.created),
75-
}
76-
7793
def _emit(self, record):
78-
if not self.can_record(record):
94+
if not _can_record(record):
7995
return
8096

8197
hub = Hub.current
8298
integration = hub.get_integration(LoggingIntegration)
8399
if integration is None:
84100
return
85101

86-
if self._should_create_event(record):
87-
with capture_internal_exceptions():
88-
hint = None
89-
# exc_info might be None or (None, None, None)
90-
if record.exc_info is not None and record.exc_info[0] is not None:
91-
event, hint = event_from_exception(
92-
record.exc_info,
93-
client_options=hub.client.options,
94-
mechanism={"type": "logging", "handled": True},
95-
)
96-
else:
97-
event = {}
98-
99-
event["level"] = self._logging_to_event_level(record.levelname)
100-
event["logger"] = record.name
101-
event["logentry"] = {
102-
"message": to_string(record.msg),
103-
"params": record.args,
104-
}
105-
106-
hub.capture_event(event, hint=hint)
102+
# exc_info might be None or (None, None, None)
103+
if record.exc_info is not None and record.exc_info[0] is not None:
104+
event, hint = event_from_exception(
105+
record.exc_info,
106+
client_options=hub.client.options,
107+
mechanism={"type": "logging", "handled": True},
108+
)
109+
else:
110+
event = {}
111+
hint = None
112+
113+
event["level"] = _logging_to_event_level(record.levelname)
114+
event["logger"] = record.name
115+
event["logentry"] = {"message": to_string(record.msg), "params": record.args}
107116

117+
hub.capture_event(event, hint=hint)
118+
119+
120+
# Legacy name
121+
SentryHandler = EventHandler
122+
123+
124+
class BreadcrumbHandler(logging.Handler, object):
125+
def emit(self, record):
108126
with capture_internal_exceptions():
109-
hub.add_breadcrumb(
110-
self._breadcrumb_from_record(record), hint={"log_record": record}
111-
)
127+
self.format(record)
128+
return self._emit(record)
112129

113-
def _logging_to_event_level(self, levelname):
114-
return {"critical": "fatal"}.get(levelname.lower(), levelname.lower())
130+
def _emit(self, record):
131+
if not _can_record(record):
132+
return
133+
134+
hub = Hub.current
135+
integration = hub.get_integration(LoggingIntegration)
136+
if integration is None:
137+
return
115138

116-
def _should_create_event(self, record):
117-
return self._event_level is not None and record.levelno >= self._event_level
139+
hub.add_breadcrumb(_breadcrumb_from_record(record), hint={"log_record": record})

0 commit comments

Comments
 (0)