Skip to content

Commit db2b9bb

Browse files
radiophysicistpaveldedik
authored andcommitted
feat: Add support for custom log levels
1 parent 317f073 commit db2b9bb

2 files changed

Lines changed: 33 additions & 4 deletions

File tree

structlog_sentry/__init__.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,21 @@ def _handle_breadcrumb(self, event_dict: EventDict) -> None:
177177
event, hint = self._get_breadcrumb_and_hint(event_dict)
178178
self._get_hub().add_breadcrumb(event, hint=hint)
179179

180+
@staticmethod
181+
def _get_level_value(level_name: str) -> int:
182+
"""Get numeric value for the log level name given."""
183+
try:
184+
# Try to get one of predefined log levels
185+
return getattr(logging, level_name)
186+
except AttributeError as e:
187+
# May be it is a custom log level?
188+
level = logging.getLevelName(level_name)
189+
if isinstance(level, int):
190+
return level
191+
192+
# Re-raise original error
193+
raise ValueError(f"{level_name} is not a valid log level") from e
194+
180195
def __call__(
181196
self, logger: WrappedLogger, name: str, event_dict: EventDict
182197
) -> EventDict:
@@ -185,7 +200,7 @@ def __call__(
185200
sentry_skip = event_dict.pop("sentry_skip", False)
186201

187202
if self.active and not sentry_skip and self._can_record(logger, event_dict):
188-
level = getattr(logging, event_dict["level"].upper())
203+
level = self._get_level_value(event_dict["level"].upper())
189204

190205
if level >= self.event_level:
191206
self._handle_event(event_dict)

test/test_sentry_processor.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@
1111
]
1212

1313

14+
# Register custom log level
15+
CUSTOM_LOG_LEVEL_NAME = "CUSTOM_LEVEL"
16+
CUSTOM_LOG_LEVEL_VALUE = logging.DEBUG
17+
logging.addLevelName(CUSTOM_LOG_LEVEL_VALUE, CUSTOM_LOG_LEVEL_NAME)
18+
19+
1420
@dataclass
1521
class ClientParams:
1622
include_local_variables: bool = True
@@ -78,11 +84,19 @@ def test_sentry_sent():
7884
assert event_dict.get("sentry") == "sent"
7985

8086

81-
@pytest.mark.parametrize("level", ["debug", "info", "warning"])
82-
def test_sentry_log(sentry_events, level):
87+
@pytest.mark.parametrize(
88+
"level, level_value",
89+
[
90+
(CUSTOM_LOG_LEVEL_NAME, CUSTOM_LOG_LEVEL_VALUE),
91+
("debug", logging.DEBUG),
92+
("info", logging.INFO),
93+
("warning", logging.WARNING),
94+
],
95+
)
96+
def test_sentry_log(sentry_events, level, level_value):
8397
event_data = {"level": level, "event": level + " message"}
8498

85-
processor = SentryProcessor(event_level=getattr(logging, level.upper()))
99+
processor = SentryProcessor(event_level=level_value)
86100
processor(None, None, event_data)
87101

88102
assert_event_dict(event_data, sentry_events)

0 commit comments

Comments
 (0)