@@ -29,7 +29,24 @@ class LoggingIntegration(Integration):
29
29
identifier = "logging"
30
30
31
31
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 )
33
50
34
51
@staticmethod
35
52
def setup_once ():
@@ -43,75 +60,80 @@ def sentry_patched_callhandlers(self, record):
43
60
if record .name not in _IGNORED_LOGGERS :
44
61
integration = Hub .current .get_integration (LoggingIntegration )
45
62
if integration is not None :
46
- integration ._handler . handle (record )
63
+ integration ._handle_record (record )
47
64
return old_callhandlers (self , record )
48
65
49
66
logging .Logger .callHandlers = sentry_patched_callhandlers
50
67
51
68
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
+
59
82
83
+ def _logging_to_event_level (levelname ):
84
+ return {"critical" : "fatal" }.get (levelname .lower (), levelname .lower ())
85
+
86
+
87
+ class EventHandler (logging .Handler , object ):
60
88
def emit (self , record ):
61
89
with capture_internal_exceptions ():
62
90
self .format (record )
63
91
return self ._emit (record )
64
92
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
-
77
93
def _emit (self , record ):
78
- if not self . can_record (record ):
94
+ if not _can_record (record ):
79
95
return
80
96
81
97
hub = Hub .current
82
98
integration = hub .get_integration (LoggingIntegration )
83
99
if integration is None :
84
100
return
85
101
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 }
107
116
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 ):
108
126
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 )
112
129
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
115
138
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