Skip to content

Commit 9981676

Browse files
committed
Improve "InterceptHandler" recipe for frozen modules
1 parent dfe9607 commit 9981676

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

README.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -317,17 +317,21 @@ Want to intercept standard `logging` messages toward your Loguru sinks?
317317

318318
```python
319319
class InterceptHandler(logging.Handler):
320-
def emit(self, record: logging.LogRecord) -> None:
320+
def emit(self, record):
321321
# Get corresponding Loguru level if it exists.
322-
level: str | int
323322
try:
324-
level = logger.level(record.levelname).name
323+
level: int | str = logger.level(record.levelname).name
325324
except ValueError:
326325
level = record.levelno
327326

328327
# Find caller from where originated the logged message.
329328
frame, depth = inspect.currentframe(), 0
330-
while frame and (depth == 0 or frame.f_code.co_filename == logging.__file__):
329+
while frame:
330+
filename = frame.f_code.co_filename
331+
is_logging = filename == logging.__file__
332+
is_frozen = "importlib" in filename and "_bootstrap" in filename
333+
if depth > 0 and not (is_logging or is_frozen):
334+
break
331335
frame = frame.f_back
332336
depth += 1
333337

tests/test_interception.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88

99
class InterceptHandler(logging.Handler):
10-
def emit(self, record):
10+
def emit(self, record: logging.LogRecord) -> None:
1111
# Get corresponding Loguru level if it exists.
1212
try:
1313
level = logger.level(record.levelname).name
@@ -16,7 +16,12 @@ def emit(self, record):
1616

1717
# Find caller from where originated the logged message.
1818
frame, depth = inspect.currentframe(), 0
19-
while frame and (depth == 0 or frame.f_code.co_filename == logging.__file__):
19+
while frame:
20+
filename = frame.f_code.co_filename
21+
is_logging = filename == logging.__file__
22+
is_frozen = "importlib" in filename and "_bootstrap" in filename
23+
if depth > 0 and not (is_logging or is_frozen):
24+
break
2025
frame = frame.f_back
2126
depth += 1
2227

@@ -31,7 +36,7 @@ def test_formatting(writer):
3136

3237
expected = (
3338
"tests.test_interception - test_interception.py - test_formatting - DEBUG - "
34-
"10 - 39 - test_interception - This is the message\n"
39+
"10 - 44 - test_interception - This is the message\n"
3540
)
3641

3742
with make_logging_logger("tests", InterceptHandler()) as logging_logger:
@@ -158,4 +163,4 @@ def test_using_logging_function(writer):
158163
logging.warning("ABC")
159164

160165
result = writer.read()
161-
assert result == "test_using_logging_function 158 test_interception test_interception.py ABC\n"
166+
assert result == "test_using_logging_function 163 test_interception test_interception.py ABC\n"

0 commit comments

Comments
 (0)