⭐ First of all - love this project, huge fan, good job.
Hello,
Maybe this is just bad setup on our end, but it was tricky to figure out so I decided to raise it.
We use structlog for logging data from our service in json format, and then uploading it into DataDog. After updating structlog to version 24.4.0 our logging started to break each time we logged an exception ( structlog.get_logger().exception(...))
Stack Trace
```bash
File "/usr/local/lib/python3.12/site-packages/structlog/_base.py", line 165, in _process_event
event_dict = proc(self._logger, method_name, event_dict)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/structlog/processors.py", line 412, in __call__
event_dict["exception"] = self.format_exception(
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/structlog/tracebacks.py", line 415, in __call__
trace = extract(
^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/structlog/tracebacks.py", line 276, in extract
key: to_repr(
^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/structlog/tracebacks.py", line 147, in to_repr
obj_repr = rich.pretty.traverse(
^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/rich/pretty.py", line 853, in traverse
node = _traverse(_object, root=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/rich/pretty.py", line 767, in _traverse
child_node = _traverse(getattr(obj, field.name), depth=depth + 1)
^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'MemoryObjectItemReceiver' object has no attribute 'item'
```
Since we don't install rich on the server, I'm not really sure how it was able to import it in the first place (my guess is transitive dependency), or why it failed.
But would it make sense to somehow configure the use_rich flag globally?
Structlog version: 24.4.0
Hello,
Maybe this is just bad setup on our end, but it was tricky to figure out so I decided to raise it.
We use
structlog
for logging data from our service in json format, and then uploading it intoDataDog
. After updating structlog to version24.4.0
our logging started to break each time we logged an exception (structlog.get_logger().exception(...)
)I was able to trace the root cause to this PR: https://github.com/hynek/structlog/pull/627, where the implementation for
to_repr
changed to:and I was able to hotfix the the problem on our end by creating our own
dict_tracebacks
and settinguse_rich
explicitly.Stack Trace
```bash File "/usr/local/lib/python3.12/site-packages/structlog/_base.py", line 165, in _process_event event_dict = proc(self._logger, method_name, event_dict) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/structlog/processors.py", line 412, in __call__ event_dict["exception"] = self.format_exception( ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/structlog/tracebacks.py", line 415, in __call__ trace = extract( ^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/structlog/tracebacks.py", line 276, in extract key: to_repr( ^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/structlog/tracebacks.py", line 147, in to_repr obj_repr = rich.pretty.traverse( ^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/rich/pretty.py", line 853, in traverse node = _traverse(_object, root=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/rich/pretty.py", line 767, in _traverse child_node = _traverse(getattr(obj, field.name), depth=depth + 1) ^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'MemoryObjectItemReceiver' object has no attribute 'item' ```Since we don't install
rich
on the server, I'm not really sure how it was able to import it in the first place (my guess is transitive dependency), or why it failed.But would it make sense to somehow configure the
use_rich
flag globally?