structlog v21.1.0 Release Notes

Release Date: 2021-02-18 // 8 months ago
  • Backward-incompatible changes:


    ๐Ÿ—„ Deprecations: ^


    ๐Ÿ”„ Changes: ^

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

Previous changes from v20.2.0

  • 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 <>_

    • 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 <>_.

    ๐Ÿ—„ 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 <>, #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 <>_
    • 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 <>_,
    • ๐Ÿ–จ structlog.PrintLogger now supports copy.deepcopy(). #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 <>_