Skip to content

Commit 6070a0d

Browse files
authored
Fix exception thrown when LoggerProvider not configured (open-telemetry#3423)
1 parent 9f3c0af commit 6070a0d

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## Unreleased
99

10+
- Fix error when no LoggerProvider configured for LoggingHandler
11+
([#3423](https://github.com/open-telemetry/opentelemetry-python/pull/3423))
12+
1013
## Version 1.20.0/0.41b0 (2023-09-04)
1114

1215
- Modify Prometheus exporter to translate non-monotonic Sums into Gauges
1316
([#3306](https://github.com/open-telemetry/opentelemetry-python/pull/3306))
1417

15-
1618
## Version 1.19.0/0.40b0 (2023-07-13)
1719

1820
- Drop `setuptools` runtime requirement.

opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
from opentelemetry._logs import LoggerProvider as APILoggerProvider
2828
from opentelemetry._logs import LogRecord as APILogRecord
2929
from opentelemetry._logs import (
30+
NoOpLogger,
3031
SeverityNumber,
3132
get_logger,
3233
get_logger_provider,
@@ -532,11 +533,12 @@ def _translate(self, record: logging.LogRecord) -> LogRecord:
532533

533534
def emit(self, record: logging.LogRecord) -> None:
534535
"""
535-
Emit a record.
536+
Emit a record. Skip emitting if logger is NoOp.
536537
537538
The record is translated to OTel format, and then sent across the pipeline.
538539
"""
539-
self._logger.emit(self._translate(record))
540+
if not isinstance(self._logger, NoOpLogger):
541+
self._logger.emit(self._translate(record))
540542

541543
def flush(self) -> None:
542544
"""

opentelemetry-sdk/tests/logs/test_handler.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import unittest
1616
from unittest.mock import Mock
1717

18-
from opentelemetry._logs import SeverityNumber
18+
from opentelemetry._logs import NoOpLoggerProvider, SeverityNumber
1919
from opentelemetry._logs import get_logger as APIGetLogger
2020
from opentelemetry.attributes import BoundedAttributes
2121
from opentelemetry.sdk import trace
@@ -64,6 +64,21 @@ def test_handler_custom_log_level(self):
6464
logger.critical("No Time For Caution")
6565
self.assertEqual(emitter_mock.emit.call_count, 2)
6666

67+
# pylint: disable=protected-access
68+
def test_log_record_emit_noop(self):
69+
noop_logger_provder = NoOpLoggerProvider()
70+
logger_mock = APIGetLogger(
71+
__name__, logger_provider=noop_logger_provder
72+
)
73+
logger = logging.getLogger(__name__)
74+
handler_mock = Mock(spec=LoggingHandler)
75+
handler_mock._logger = logger_mock
76+
handler_mock.level = logging.WARNING
77+
logger.addHandler(handler_mock)
78+
with self.assertLogs(level=logging.WARNING):
79+
logger.warning("Warning message")
80+
handler_mock._translate.assert_not_called()
81+
6782
def test_log_record_no_span_context(self):
6883
emitter_provider_mock = Mock(spec=LoggerProvider)
6984
emitter_mock = APIGetLogger(

0 commit comments

Comments
 (0)