All Versions
23
Latest Version
Avg Release Cycle
123 days
Latest Release
248 days ago

Changelog History
Page 1

  • v21.1.0 Changes

    February 18, 2021

    Backward-incompatible changes:

    none

    ๐Ÿ—„ Deprecations: ^

    none

    ๐Ÿ”„ Changes: ^

    • structlog.threadlocal.wrap_dict() now has a correct type annotation. #290 <https://github.com/hynek/structlog/pull/290>_
    • ๐Ÿ›  Fix isolation in structlog.contextvars. #302 <https://github.com/hynek/structlog/pull/302>_
    • ๐Ÿ”ง The default configuration and loggers are pickleable again. #301 <https://github.com/hynek/structlog/pull/301>_
    • structlog.dev.ConsoleRenderer will now look for a logger_name key if no logger key is set. #295 <https://github.com/hynek/structlog/pull/295>_

  • v20.2.0 Changes

    December 31, 2020

    Backward-incompatible changes:

    • ๐Ÿ‘ Python 2.7 and 3.5 aren't supported anymore. The package meta data should ensure that you keep getting 20.1.0 on those versions. #244 <https://github.com/hynek/structlog/pull/244>_

    • structlog is now fully type-annotated. This won't break your applications, but if you use Mypy, it will most likely break your CI.

    Check out the new chapter on typing for details.

    • ๐Ÿ”ง The default bound logger (wrapper_class) if you don't configure structlog has changed. It's mostly compatible with the old one but a few uncommon methods like log, failure, or err don't exist anymore.

    You can regain the old behavior by using structlog.configure(wrapper_class=structlog.BoundLogger).

    Please note that due to the various interactions between settings, it's possible that you encounter even more errors. We strongly urge you to always configure all possible settings since the default configuration is not covered by our backward compatibility policy <https://www.structlog.org/en/stable/backward-compatibility.html>_.

    ๐Ÿ—„ Deprecations: ^

    • ๐Ÿ—„ Accessing the _context attribute of a bound logger is now deprecated. Please use the new structlog.get_context().

    ๐Ÿ”„ Changes: ^

    • structlog has now type hints for all of its APIs! Since structlog is highly dynamic and configurable, this led to a few concessions like a specialized structlog.stdlib.get_logger() whose only difference to structlog.get_logger() is that it has the correct type hints.

    We consider them provisional for the time being โ€“ i.e. the backward compatibility does not apply to them in its full strength until we feel we got it right. Please feel free to provide feedback! #223 <https://github.com/hynek/structlog/issues/223>, #282 <https://github.com/hynek/structlog/issues/282>

    • Added structlog.make_filtering_logger that can be used like configure(wrapper_class=make_filtering_bound_logger(logging.INFO)). It creates a highly optimized bound logger whose inactive methods only consist of a return None. This is now also the default logger.
    • ๐ŸŒฒ As a complement, structlog.stdlib.add_log_level() can now additionally be imported as structlog.processors.add_log_level since it just adds the method name to the event dict.
    • ๐ŸŒฒ structlog.processors.add_log_level() is now part of the default configuration.
    • structlog.stdlib.ProcessorFormatter no longer uses exceptions for control flow, allowing foreign_pre_chain processors to use sys.exc_info() to access the real exception.
    • โž• Added structlog.BytesLogger to avoid unnecessary encoding round trips. Concretely this is useful with orjson which returns bytes. #271 <https://github.com/hynek/structlog/issues/271>_
    • The final processor now also may return bytes that are passed untouched to the wrapped logger.
    • structlog.get_context() allows you to retrieve the original context of a bound logger. #266 <https://github.com/hynek/structlog/issues/266>_,
    • ๐Ÿ–จ structlog.PrintLogger now supports copy.deepcopy(). #268 <https://github.com/hynek/structlog/issues/268>_
    • โž• Added structlog.testing.CapturingLogger for more unit testing goodness.
    • โž• Added structlog.stdlib.AsyncBoundLogger that executes logging calls in a thread executor and therefore doesn't block. #245 <https://github.com/hynek/structlog/pull/245>_

  • v20.1.0 Changes

    January 28, 2020

    Backward-incompatible changes:

    none

    ๐Ÿ—„ Deprecations: ^

    • ๐Ÿ‘ This is the last version to support Python 2.7 (including PyPy) and 3.5. All following versions will only support Python 3.6 or later.

    ๐Ÿ”„ Changes: ^

    • โž• Added a new module structlog.contextvars that allows to have a global but context-local structlog context the same way as with structlog.threadlocal since 19.2.0. #201 <https://github.com/hynek/structlog/issues/201>, #236 <https://github.com/hynek/structlog/pull/236>
    • โž• Added a new module structlog.testing for first class testing support. The first entry is the context manager capture_logs() that allows to make assertions about structured log calls. #14 <https://github.com/hynek/structlog/issues/14>, #234 <https://github.com/hynek/structlog/pull/234>
    • โž• Added structlog.threadlocal.unbind_threadlocal(). #239 <https://github.com/hynek/structlog/pull/239>_
    • The logger created by structlog.get_logger() is not detected as an abstract method anymore, when attached to an abstract base class. #229 <https://github.com/hynek/structlog/issues/229>_
    • ๐Ÿ colorama isn't initialized lazily on Windows anymore because it breaks rendering. #232 <https://github.com/hynek/structlog/issues/232>, #242 <https://github.com/hynek/structlog/pull/242>

  • v19.2.0 Changes

    October 16, 2019

    Backward-incompatible changes:

    • ๐Ÿ‘ Python 3.4 is not supported anymore. It has been unsupported by the Python core team for a while now and its PyPI downloads are negligible.

    It's very unlikely that structlog will break under 3.4 anytime soon, but we don't test it anymore.

    ๐Ÿ—„ Deprecations: ^

    none

    ๐Ÿ”„ Changes: ^

    • ๐Ÿ‘ Full Python 3.8 support for structlog.stdlib.
    • โž• Added more pass-through properties to structlog.stdlib.BoundLogger. To makes it easier to use it as a drop-in replacement for logging.Logger. #198 <https://github.com/hynek/structlog/issues/198>_
    • structlog.stdlib.ProcessorFormatter now takes a logger object as an optional keyword argument. This makes ProcessorFormatter work properly with stuctlog.stdlib.filter_by_level(). #219 <https://github.com/hynek/structlog/issues/219>_
    • 0๏ธโƒฃ structlog.dev.ConsoleRenderer now uses no colors by default, if colorama is not available. #215 <https://github.com/hynek/structlog/issues/215>_
    • structlog.dev.ConsoleRenderer now initializes colorama lazily, to prevent accidental side-effects just by importing structlog. #210 <https://github.com/hynek/structlog/issues/210>_
    • Added new processor structlog.dev.set_exc_info() that will set exc_info=True if the method's name is exception and exc_info isn't set at all. This is only necessary when the standard library integration is not used. It fixes the problem that in the default configuration, structlog.get_logger().exception("hi") in an except block would not print the exception without passing exc_info=True to it explicitly. #130 <https://github.com/hynek/structlog/issues/130>, #173 <https://github.com/hynek/structlog/issues/173>, #200 <https://github.com/hynek/structlog/issues/200>, #204 <https://github.com/hynek/structlog/issues/204>
    • A best effort has been made to make as much of structlog pickleable as possible to make it friendlier with multiprocessing and similar libraries. Some classes can only be pickled on Python 3 or using the dill <https://pypi.org/project/dill/>_ library though and that is very unlikely to change.

    So far, the configuration proxy, structlog.processor.TimeStamper, structlog.BoundLogger, structlog.PrintLogger and structlog.dev.ConsoleRenderer have been made pickelable. Please report if you need any another class fixed. #126 <https://github.com/hynek/structlog/issues/126>_

    • โž• Added a new thread-local API that allows binding values to a thread-local context explicitly without affecting the default behavior of bind(). #222 <https://github.com/hynek/structlog/issues/222>, #225 <https://github.com/hynek/structlog/issues/225>
    • Added pass_foreign_args argument to structlog.stdlib.ProcessorFormatter. It allows to pass a foreign log record's args attribute to the event dictionary under the positional_args key. #228 <https://github.com/hynek/structlog/issues/228>_
    • structlog.dev.ConsoleRenderer now calls str() on the event value. #221 <https://github.com/hynek/structlog/issues/221>_

  • v19.1.0 Changes

    February 02, 2019

    Backward-incompatible changes:

    • As announced in 18.1.0, pip install -e .[dev] now installs all development dependencies. Sorry for the inconveniences this undoubtedly will cause!

    ๐Ÿ—„ Deprecations: ^

    none

    ๐Ÿ”„ Changes: ^

    • ๐Ÿ–จ structlog.ReturnLogger and structlog.PrintLogger now have a fatal() log method. #181 <https://github.com/hynek/structlog/issues/181>_
    • ๐Ÿ‘ป Under certain (rather unclear) circumstances, the frame extraction could throw an SystemError: error return without exception set. A workaround has been added. #174 <https://github.com/hynek/structlog/issues/174>_
    • ๐ŸŒฒ structlog now tolerates passing through dict\ s to stdlib logging. #187 <https://github.com/hynek/structlog/issues/187>, #188 <https://github.com/hynek/structlog/pull/188>, #189 <https://github.com/hynek/structlog/pull/189>_

  • v18.2.0 Changes

    September 05, 2018

    Backward-incompatible changes:

    none

    ๐Ÿ—„ Deprecations: ^

    none

    ๐Ÿ”„ Changes: ^

    • ๐ŸŒฒ Added structlog.stdlib.add_log_level_number() processor that adds the level number to the event dictionary. Can be used to simplify log filtering. #151 <https://github.com/hynek/structlog/pull/151>_
    • 0๏ธโƒฃ structlog.processors.JSONRenderer now allows for overwriting the default argument of its serializer. #77 <https://github.com/hynek/structlog/pull/77>, #163 <https://github.com/hynek/structlog/pull/163>
    • โž• Added try_unbind() that works like unbind() but doesn't raise a KeyError if one of the keys is missing. #171 <https://github.com/hynek/structlog/pull/171>_

  • v18.1.0 Changes

    January 27, 2018

    Backward-incompatible changes:

    none

    ๐Ÿ—„ Deprecations: ^

    • The meaning of the structlog[dev] installation target will change from "colorful output" to "dependencies to develop structlog" in 19.1.0.

    The main reason behind this decision is that it's impossible to have a structlog in your normal dependencies and additionally a structlog[dev] for development (pip will report an error).

    ๐Ÿ”„ Changes: ^

    • Empty strings are valid events now. #110 <https://github.com/hynek/structlog/issues/110>_
    • Do not encapsulate Twisted failures twice with newer versions of Twisted. #144 <https://github.com/hynek/structlog/issues/144>_
    • ๐Ÿ‘ฎ structlog.dev.ConsoleRenderer now accepts a force_colors argument to output colored logs even if the destination is not a tty. Use this option if your logs are stored in files that are intended to be streamed to the console.
    • structlog.dev.ConsoleRenderer now accepts a level_styles argument for overriding the colors for individual levels, as well as to add new levels. See the docs for ConsoleRenderer.get_default_level_styles() for usage. #139 <https://github.com/hynek/structlog/pull/139>_
    • ๐Ÿ‘ป structlog.stdlib.BoundLogger.exception() now uses the exc_info argument if it has been passed instead of setting it unconditionally to True. #149 <https://github.com/hynek/structlog/pull/149>_
    • ๐Ÿ”ง Default configuration now uses plain dict\ s on Python 3.6+ and PyPy since they are ordered by default.
    • โž• Added structlog.is_configured() to check whether or not structlog has been configured.
    • โž• Added structlog.get_config() to introspect current configuration.

  • v17.2.0 Changes

    May 15, 2017

    Backward-incompatible changes:

    none

    ๐Ÿ—„ Deprecations: ^

    none

    ๐Ÿ”„ Changes: ^

    • structlog.stdlib.ProcessorFormatter now accepts keep_exc_info and keep_stack_info arguments to control what to do with this information on log records. Most likely you want them both to be False therefore it's the default. #109 <https://github.com/hynek/structlog/issues/109>_
    • structlog.stdlib.add_logger_name() now works in structlog.stdlib.ProcessorFormatter's foreign_pre_chain. #112 <https://github.com/hynek/structlog/issues/112>_
    • ๐ŸŒฒ Clear log record args in structlog.stdlib.ProcessorFormatter after rendering. This fix is for you if you tried to use it and got TypeError: not all arguments converted during string formatting exceptions. #116 <https://github.com/hynek/structlog/issues/116>, #117 <https://github.com/hynek/structlog/issues/117>

  • v17.1.0 Changes

    April 24, 2017

    ๐Ÿš€ The main features of this release are massive improvements in standard library's logging integration. โšก๏ธ Have a look at the updated standard library chapter <https://www.structlog.org/en/stable/standard-library.html>_ on how to use them! Special thanks go to Fabian Bรผchler <https://github.com/fabianbuechler>, Gilbert Gilb's <https://github.com/gilbsgilbs>, Iva Kaneva <https://github.com/if-fi>, insolite <https://github.com/insolite>, and sky-code <https://github.com/sky-code>_, that made them possible.

    Backward-incompatible changes:

    • ๐Ÿ”ง The default renderer now is structlog.dev.ConsoleRenderer if you don't configure structlog. Colors are used if available and human-friendly timestamps are prepended. This is in line with our backward compatibility policy <https://www.structlog.org/en/stable/backward-compatibility.html>_ that explicitly excludes default settings.

    ๐Ÿ”„ Changes: ^

    • Added structlog.stdlib.render_to_log_kwargs(). This allows you to use logging-based formatters to take care of rendering your entries. #98 <https://github.com/hynek/structlog/issues/98>_
    • โž• Added structlog.stdlib.ProcessorFormatter which does the opposite: This allows you to run structlog processors on arbitrary logging.LogRecords. #79 <https://github.com/hynek/structlog/issues/79>, #105 <https://github.com/hynek/structlog/issues/105>
    • UNIX epoch timestamps from structlog.processors.TimeStamper are more precise now.
    • Added repr_native_str to structlog.processors.KeyValueRenderer and structlog.dev.ConsoleRenderer. This allows for human-readable non-ASCII output on Python 2 (repr() on Python 2 behaves like ascii() on Python 3 in that regard). As per compatibility policy, it's on (original behavior) in KeyValueRenderer and off (humand-friendly behavior) in ConsoleRenderer. #94 <https://github.com/hynek/structlog/issues/94>_
    • Added colors argument to structlog.dev.ConsoleRenderer and made it the default renderer. #78 <https://github.com/hynek/structlog/pull/78>_
    • ๐Ÿ›  Fixed bug with Python 3 and structlog.stdlib.BoundLogger.log(). Error log level was not reproductible and was logged as exception one time out of two. #92 <https://github.com/hynek/structlog/pull/92>_
    • ๐Ÿšš Positional arguments are now removed even if they are empty. #82 <https://github.com/hynek/structlog/pull/82>_

  • v16.1.0 Changes

    May 24, 2016

    Backward-incompatible changes:

    • ๐Ÿ‘ Python 3.3 and 2.6 aren't supported anymore. They may work by chance but any effort to keep them working has ceased.

    The last Python 2.6 release was on October 29, 2013 and isn't supported by the CPython core team anymore. Major Python packages like Django and Twisted dropped Python 2.6 a while ago already.

    Python 3.3 never had a significant user base and wasn't part of any distribution's LTS release.

    ๐Ÿ”„ Changes: ^

    • โž• Add a drop_missing argument to KeyValueRenderer. If key_order is used and a key is missing a value, it's not rendered at all instead of being rendered as None. #67 <https://github.com/hynek/structlog/pull/67>_
    • Exceptions without a __traceback__ are now also rendered on Python 3.
    • Don't cache loggers in lazy proxies returned from get_logger(). This lead to in-place mutation of them if used before configuration which in turn lead to the problem that configuration was applied only partially to them later. #72 <https://github.com/hynek/structlog/pull/72>_