@@ -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