Skip to content

Commit 3d38329

Browse files
authored
Use logging levelno instead of levelname. Levelnames can be overridden (#1449)
Use logging levelno instead of levelname. Levelnames can be overridden. Fixes #1449
1 parent 23e0295 commit 3d38329

File tree

2 files changed

+57
-5
lines changed

2 files changed

+57
-5
lines changed

sentry_sdk/integrations/logging.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,16 @@
2424

2525
DEFAULT_LEVEL = logging.INFO
2626
DEFAULT_EVENT_LEVEL = logging.ERROR
27+
LOGGING_TO_EVENT_LEVEL = {
28+
logging.NOTSET: "notset",
29+
logging.DEBUG: "debug",
30+
logging.INFO: "info",
31+
logging.WARN: "warning", # WARN is same a WARNING
32+
logging.WARNING: "warning",
33+
logging.ERROR: "error",
34+
logging.FATAL: "fatal",
35+
logging.CRITICAL: "fatal", # CRITICAL is same as FATAL
36+
}
2737

2838
# Capturing events from those loggers causes recursion errors. We cannot allow
2939
# the user to unconditionally create events from those loggers under any
@@ -110,17 +120,19 @@ def _breadcrumb_from_record(record):
110120
# type: (LogRecord) -> Dict[str, Any]
111121
return {
112122
"type": "log",
113-
"level": _logging_to_event_level(record.levelname),
123+
"level": _logging_to_event_level(record),
114124
"category": record.name,
115125
"message": record.message,
116126
"timestamp": datetime.datetime.utcfromtimestamp(record.created),
117127
"data": _extra_from_record(record),
118128
}
119129

120130

121-
def _logging_to_event_level(levelname):
122-
# type: (str) -> str
123-
return {"critical": "fatal"}.get(levelname.lower(), levelname.lower())
131+
def _logging_to_event_level(record):
132+
# type: (LogRecord) -> str
133+
return LOGGING_TO_EVENT_LEVEL.get(
134+
record.levelno, record.levelname.lower() if record.levelname else ""
135+
)
124136

125137

126138
COMMON_RECORD_ATTRS = frozenset(
@@ -220,7 +232,7 @@ def _emit(self, record):
220232

221233
hint["log_record"] = record
222234

223-
event["level"] = _logging_to_event_level(record.levelname)
235+
event["level"] = _logging_to_event_level(record)
224236
event["logger"] = record.name
225237

226238
# Log records from `warnings` module as separate issues

tests/integrations/logging/test_logging.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# coding: utf-8
12
import sys
23

34
import pytest
@@ -115,6 +116,45 @@ def test_logging_level(sentry_init, capture_events):
115116
assert not events
116117

117118

119+
def test_custom_log_level_names(sentry_init, capture_events):
120+
levels = {
121+
logging.DEBUG: "debug",
122+
logging.INFO: "info",
123+
logging.WARN: "warning",
124+
logging.WARNING: "warning",
125+
logging.ERROR: "error",
126+
logging.CRITICAL: "fatal",
127+
logging.FATAL: "fatal",
128+
}
129+
130+
# set custom log level names
131+
# fmt: off
132+
logging.addLevelName(logging.DEBUG, u"custom level debüg: ")
133+
# fmt: on
134+
logging.addLevelName(logging.INFO, "")
135+
logging.addLevelName(logging.WARN, "custom level warn: ")
136+
logging.addLevelName(logging.WARNING, "custom level warning: ")
137+
logging.addLevelName(logging.ERROR, None)
138+
logging.addLevelName(logging.CRITICAL, "custom level critical: ")
139+
logging.addLevelName(logging.FATAL, "custom level 🔥: ")
140+
141+
for logging_level, sentry_level in levels.items():
142+
logger.setLevel(logging_level)
143+
sentry_init(
144+
integrations=[LoggingIntegration(event_level=logging_level)],
145+
default_integrations=False,
146+
)
147+
events = capture_events()
148+
149+
logger.log(logging_level, "Trying level %s", logging_level)
150+
assert events
151+
assert events[0]["level"] == sentry_level
152+
assert events[0]["logentry"]["message"] == "Trying level %s"
153+
assert events[0]["logentry"]["params"] == [logging_level]
154+
155+
del events[:]
156+
157+
118158
def test_logging_filters(sentry_init, capture_events):
119159
sentry_init(integrations=[LoggingIntegration()], default_integrations=False)
120160
events = capture_events()

0 commit comments

Comments
 (0)