-
-
Notifications
You must be signed in to change notification settings - Fork 264
Open
Labels
Description
There is an example at https://www.structlog.org/en/25.4.0/performance.html about how to use structlog with orjson:
import logging
import orjson
import structlog
structlog.configure(
cache_logger_on_first_use=True,
wrapper_class=structlog.make_filtering_bound_logger(logging.INFO),
processors=[
structlog.contextvars.merge_contextvars,
structlog.processors.add_log_level,
structlog.processors.format_exc_info,
structlog.processors.TimeStamper(fmt="iso", utc=True),
structlog.processors.JSONRenderer(serializer=orjson.dumps),
],
logger_factory=structlog.BytesLoggerFactory(),
)
And it works perfectly:
log = structlog.get_logger('my_logger')
log.info('test') # prints {"event":"test","level":"info","timestamp":"2025-07-18T07:58:55.479135Z"}
However, if I add processor structlog.stdlib.add_logger_name to include logger name it stops working:
Traceback (most recent call last):
File "/home/kxepal/projects/example.py", line 20, in <module>
log.info('test')
File "/home/kxepal/projects/venv/lib/python3.12/site-packages/structlog/_native.py", line 144, in meth
return self._proxy_to_logger(name, event, **kw)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/kxepal/projects/venv/lib/python3.12/site-packages/structlog/_base.py", line 222, in _proxy_to_logger
args, kw = self._process_event(method_name, event, event_kw)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/kxepal/projects/venv/lib/python3.12/site-packages/structlog/_base.py", line 173, in _process_event
event_dict = proc(self._logger, method_name, event_dict)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/kxepal/projects/venv/lib/python3.12/site-packages/structlog/stdlib.py", line 832, in add_logger_name
event_dict["logger"] = logger.name
^^^^^^^^^^^
AttributeError: 'BytesLogger' object has no attribute 'name'
Full example to reproduce an issue:
import logging
import orjson
import structlog
structlog.configure(
cache_logger_on_first_use=True,
wrapper_class=structlog.make_filtering_bound_logger(logging.INFO),
processors=[
structlog.stdlib.add_logger_name,
structlog.contextvars.merge_contextvars,
structlog.processors.add_log_level,
structlog.processors.format_exc_info,
structlog.processors.TimeStamper(fmt="iso", utc=True),
structlog.processors.JSONRenderer(serializer=orjson.dumps),
],
logger_factory=structlog.BytesLoggerFactory(),
)
log = structlog.get_logger('my_logger')
log.info('test')
How would I get logger name into records using BytesLoggerFactory?