33
44import logging
55
6- from sentry_sdk import get_current_hub , capture_event
6+ from sentry_sdk import get_current_hub , capture_event , add_breadcrumb
77from sentry_sdk .utils import to_string , create_event , exceptions_from_error_tuple , skip_internal_frames
88
99class SentryHandler (logging .Handler , object ):
@@ -17,7 +17,20 @@ def emit(self, record):
1717 def can_record (self , record ):
1818 return not record .name .startswith ('sentry_sdk' )
1919
20+ def _breadcrumb_from_record (self , record ):
21+ return {
22+ 'ty' : 'log' ,
23+ 'level' : self ._logging_to_event_level (record .levelname ),
24+ 'category' : record .name ,
25+ 'message' : record .message
26+ }
27+
2028 def _emit (self , record ):
29+ add_breadcrumb (self ._breadcrumb_from_record (record ))
30+
31+ if not self ._should_create_event (record ):
32+ return
33+
2134 if not self .can_record (record ):
2235 print (to_string (record .message ), file = sys .stderr )
2336 return
@@ -32,7 +45,7 @@ def _emit(self, record):
3245 get_current_hub ().client .options ['with_locals' ]
3346 )
3447
35- event ['level' ] = record .levelname . lower ( )
48+ event ['level' ] = self . _logging_to_event_level ( record .levelname )
3649 event ['logger' ] = record .name
3750
3851 event ['logentry' ] = {
@@ -42,5 +55,16 @@ def _emit(self, record):
4255
4356 capture_event (event )
4457
58+ def _logging_to_event_level (self , levelname ):
59+ return {
60+ 'critical' : 'fatal'
61+ }.get (levelname .lower (), levelname .lower ())
62+
63+ def _should_create_event (self , record ):
64+ # TODO: make configurable
65+ if record .levelno in (logging .ERROR , logging .CRITICAL ):
66+ return True
67+ return False
68+
4569
4670HANDLER = SentryHandler ()
0 commit comments