Highlights
Huge release! There's plenty of important little bug fixes and new features, but the headliner is definitely the improved ergonomics of structlog.dev.ConsoleRenderer. We have finally accepted that local development has different priorities than production and made it both mutable (with automatic re-configuration) and also easily retrievable (cr = ConsoleRenderer.get_active()). This allows you, for example, to disable Rich exception formatting as easily as structlog.dev.ConsoleRenderer.get_active().exception_formatter = structlog.dev.plain_traceback. Please check out the updated docs!
Full changelog below!
Special Thanks
This release would not be possible without my generous sponsors! Thank you to all of you making sustainable maintenance possible! If you would like to join them, go to https://github.com/sponsors/hynek and check out the sweet perks!
Above and Beyond
Variomedia AG (@variomedia), Tidelift (@tidelift), thanks.dev (@thnxdev), Privacy Solutions GmbH (@privacy-solutions), Quesma (@QuesmaOrg), FilePreviews (@filepreviews), LambdaTest (@LambdaTest-Inc), Doist (@Doist), Daniel Fortunov (@asqui), and Kevin P. Fleming (@kpfleming).
Maintenance Sustainers
Buttondown (@buttondown), Jeff McCarrell (@jmccarrell), Christopher Dignam (@chdsbd), Magnus Watn (@magnuswatn), David Cramer (@dcramer), Jesse Snyder (@jessesnyder), Rivo Laks (@rivol), Polar (@polarsource), Mike Fiedler (@miketheman), Duncan Hill (@cricalix), Colin Marquardt (@cmarqu), Pieter Swinkels (@swinkels), Nick Libertini (@libertininick), Brian M. Dennis (@crossjam), Celebrity News AG (@celebritynewsag), The Westervelt Company (@westerveltco), Sławomir Ehlert (@slafs), Mostafa Khalil (@khadrawy), Filip Mularczyk (@mukiblejlok), Thomas Klinger (@thmsklngr), Andreas Poehlmann (@ap--), August Trapper Bigelow (@atbigelow), Carlton Gibson (@carltongibson), Roboflow (@roboflow), and Jeff McCarrell (@jmccarrell).
Full Changelog
Deprecated
structlog.dev.ConsoleRenderer()'s pad_event argument has been renamed to pad_event_to to differentiate it from the boolean pad_level argument. pad_event is now deprecated.
Added
-
Added
structlog.dev.ConsoleRenderer.get_active()that returns the currently activestructlog.dev.ConsoleRenderer(). #749 -
structlog.dev.ConsoleRenderer()now supports setting theexception_formatterattribute.You can now disable the pretty-printing of exceptions by setting it to
structlog.dev.plain_traceback:cr = structlog.dev.ConsoleRenderer.get_active() cr.exception_formatter = structlog.dev.plain_traceback
Same goes for sort_keys, columns, colors, force_colors, level_styles, pad_event_to, event_key, timestamp_key, and repr_native_str.
-
Added
structlog.dev.ConsoleRenderer.get_default_column_styles()for reuse the default column styles. #741 -
structlog.testing.capture_logs()now optionally accepts processors to apply before capture. #728 -
structlog.dev.RichTracebackFormatternow exposes the upstream code_width parameter. Default width is nowNonefor full terminal width. Full terminal width is now handled by Rich itself, bringing support for reflow andCOLUMNenvironment variable. Passing-1for width is now deprecated and automatically replaced byNone. #717 -
Native loggers now allow the passing of a dictionary for dictionary-based interpolation
log.info("hello %(name)s!", {"name": "world"}). #748 -
On Python 3.11+,
structlog.processors.CallsiteParameterAddernow supportsCallsiteParameter.QUAL_NAMEthat adds the qualified name of the callsite, including scope and class names. This is only available for structlog-originated events since the standard library has no equivalent. -
structlog.stdlib.LoggerFactorynow supports the stacklevel parameter. #763
Changed
structlog.dev.rich_traceback()now throws a more helpful error when Rich is missing. #735
Fixed
-
structlog.processors.MaybeTimeStampernow respects the key argument when determining whether to overwrite the timestamp field. #747 -
structlog.tracebacks.extract()no longer raises aRecursionErrorwhen the cause chain of an exception contains itself. #739 -
Default config now respects
FORCE_COLORon Windows. #758
This release contains contributions from @agunnerson-elastic, @HairlessVillager, @hynek, @l1nd3r0th, @leonardo-panseri, and @noirbizarre.
Artifact Attestations
You can verify this release's artifact attestions using GitHub's CLI tool by downloading the sdist and wheel from PyPI and running:
$ gh attestation verify --owner hynek structlog-25.5.0.tar.gzand
$ gh attestation verify --owner hynek structlog-25.5.0-py3-none-any.whl