API Reference#

Note

The examples here use a very simplified configuration using the minimalist structlog.processors.KeyValueRenderer for brevity and to enable doctests. The output is going to be different (nicer!) with the default configuration.

structlog Package#

structlog.get_logger(*args, **initial_values)[source]#

Convenience function that returns a logger according to configuration.

>>> from structlog import get_logger
>>> log = get_logger(y=23)
>>> log.msg("hello", x=42)
y=23 x=42 event='hello'
Parameters
  • args (Any) – Optional positional arguments that are passed unmodified to the logger factory. Therefore it depends on the factory what they mean.

  • initial_values (Any) – Values that are used to pre-populate your contexts.

Returns

A proxy that creates a correctly configured bound logger when necessary. The type of that bound logger depends on your configuration and is structlog.BoundLogger by default.

Return type

Any

See Configuration for details.

If you prefer CamelCase, there’s an alias for your reading pleasure: structlog.getLogger.

New in version 0.4.0: args

structlog.getLogger(*args, **initial_values)#

CamelCase alias for structlog.get_logger.

This function is supposed to be in every source file – we don’t want it to stick out like a sore thumb in frameworks like Twisted or Zope.

structlog.wrap_logger(logger, processors=None, wrapper_class=None, context_class=None, cache_logger_on_first_use=None, logger_factory_args=None, **initial_values)[source]#

Create a new bound logger for an arbitrary logger.

Default values for processors, wrapper_class, and context_class can be set using configure.

If you set an attribute here, configure calls have no effect for the respective attribute.

In other words: selective overwriting of the defaults while keeping some is possible.

Parameters
  • initial_values (Any) – Values that are used to pre-populate your contexts.

  • logger_factory_args (Optional[Iterable[Any]]) – Values that are passed unmodified as *logger_factory_args to the logger factory if not None.

Returns

A proxy that creates a correctly configured bound logger when necessary.

Return type

Any

See configure for the meaning of the rest of the arguments.

New in version 0.4.0: logger_factory_args

structlog.configure(processors=None, wrapper_class=None, context_class=None, logger_factory=None, cache_logger_on_first_use=None)[source]#

Configures the global defaults.

They are used if wrap_logger or get_logger are called without arguments.

Can be called several times, keeping an argument at None leaves it unchanged from the current setting.

After calling for the first time, is_configured starts returning True.

Use reset_defaults to undo your changes.

Parameters

New in version 0.3.0: cache_logger_on_first_use

structlog.configure_once(processors=None, wrapper_class=None, context_class=None, logger_factory=None, cache_logger_on_first_use=None)[source]#

Configures if structlog isn’t configured yet.

It does not matter whether it was configured using configure or configure_once before.

Raises a RuntimeWarning if repeated configuration is attempted.

structlog.reset_defaults()[source]#

Resets global default values to builtin defaults.

is_configured starts returning False afterwards.

structlog.is_configured()[source]#

Return whether structlog has been configured.

If False, structlog is running with builtin defaults.

structlog.get_config()[source]#

Get a dictionary with the current configuration.

Note

Changes to the returned dictionary do not affect structlog.

class structlog.BoundLogger(logger, processors, context)[source]#

A generic BoundLogger that can wrap anything.

Every unknown method will be passed to the wrapped logger. If that’s too much magic for you, try structlog.stdlib.BoundLogger or structlog.twisted.BoundLogger which also take advantage of knowing the wrapped class which generally results in better performance.

Not intended to be instantiated by yourself. See wrap_logger() and get_logger().

bind(**new_values)#

Return a new logger with new_values added to the existing ones.

new(**new_values)#

Clear context and binds initial_values using bind.

Only necessary with dict implementations that keep global state like those wrapped by structlog.threadlocal.wrap_dict when threads are re-used.

unbind(*keys)#

Return a new logger with keys removed from the context.

Raises

KeyError – If the key is not part of the context.

structlog.make_filtering_bound_logger(min_level)[source]#

Create a new FilteringBoundLogger that only logs min_level or higher.

The logger is optimized such that log levels below min_level only consist of a return None.

Additionally it has a log(self, level: int, **kw: Any) method to mirror logging.Logger.log and structlog.stdlib.BoundLogger.log.

Compared to using structlog’s standard library integration and the structlog.stdlib.filter_by_level processor:

  • It’s faster because once the logger is built at program start, it’s a static class.

  • For the same reason you can’t change the log level once configured. Use the dynamic approach of Standard Library Logging instead, if you need this feature.

Parameters

min_level (int) – The log level as an integer. You can use the constants from logging like logging.INFO or pass the values directly. See this table from the logging docs for possible values.

New in version 20.2.0.

Changed in version 21.1.0: The returned loggers are now pickleable.

New in version 20.1.0: The log() method.

structlog.get_context(bound_logger)[source]#

Return bound_logger’s context.

The type of bound_logger and the type returned depend on your configuration.

Parameters

bound_logger (structlog.types.BindableLogger) – The bound logger whose context you want.

Returns

The actual context from bound_logger. It is not copied first.

Return type

Union[Dict[str, Any], Dict[Any, Any]]

New in version 20.2.

class structlog.PrintLogger(file=None)[source]#

Print events into a file.

Parameters

file (TextIO | None) – File to print to. (default: sys.stdout)

>>> from structlog import PrintLogger
>>> PrintLogger().msg("hello")
hello

Useful if you follow current logging best practices.

Also very useful for testing and examples since logging is finicky in doctests.

Changed in version 22.1: The implementation has been switched to use print for better monkeypatchability.

critical(message)#

Print message.

debug(message)#

Print message.

err(message)#

Print message.

error(message)#

Print message.

failure(message)#

Print message.

fatal(message)#

Print message.

info(message)#

Print message.

log(message)#

Print message.

msg(message)[source]#

Print message.

warning(message)#

Print message.

class structlog.PrintLoggerFactory(file=None)[source]#

Produce PrintLoggers.

To be used with structlog.configure‘s logger_factory.

Parameters

file (TextIO | None) – File to print to. (default: sys.stdout)

Positional arguments are silently ignored.

New in version 0.4.0.

class structlog.WriteLogger(file=None)[source]#

Write events into a file.

Parameters

file (TextIO | None) – File to print to. (default: sys.stdout)

>>> from structlog import WriteLogger
>>> WriteLogger().msg("hello")
hello

Useful if you follow current logging best practices.

Also very useful for testing and examples since logging is finicky in doctests.

A little faster and a little less versatile than the PrintLogger.

New in version 22.1.

critical(message)#

Write and flush message.

debug(message)#

Write and flush message.

err(message)#

Write and flush message.

error(message)#

Write and flush message.

failure(message)#

Write and flush message.

fatal(message)#

Write and flush message.

info(message)#

Write and flush message.

log(message)#

Write and flush message.

msg(message)[source]#

Write and flush message.

warning(message)#

Write and flush message.

class structlog.WriteLoggerFactory(file=None)[source]#

Produce WriteLoggers.

To be used with structlog.configure‘s logger_factory.

Parameters

file (TextIO | None) – File to print to. (default: sys.stdout)

Positional arguments are silently ignored.

New in version 22.1.

class structlog.BytesLogger(file=None)[source]#

Writes bytes into a file.

Parameters

file (BinaryIO | None) – File to print to. (default: sys.stdout.buffer)

Useful if you follow current logging best practices together with a formatter that returns bytes (e.g. orjson).

New in version 20.2.0.

critical(message)#

Write message.

debug(message)#

Write message.

err(message)#

Write message.

error(message)#

Write message.

failure(message)#

Write message.

fatal(message)#

Write message.

info(message)#

Write message.

log(message)#

Write message.

msg(message)[source]#

Write message.

warning(message)#

Write message.

class structlog.BytesLoggerFactory(file=None)[source]#

Produce BytesLoggers.

To be used with structlog.configure‘s logger_factory.

Parameters

file (BinaryIO | None) – File to print to. (default: sys.stdout.buffer)

Positional arguments are silently ignored.

New in version 20.2.0.

exception structlog.DropEvent[source]#

If raised by an processor, the event gets silently dropped.

Derives from BaseException because it’s technically not an error.

class structlog.BoundLoggerBase(logger, processors, context)[source]#

Immutable context carrier.

Doesn’t do any actual logging; examples for useful subclasses are:

See also Custom Wrappers.

_logger: Any#

Wrapped logger.

Note

Despite underscore available read-only to custom wrapper classes.

See also Custom Wrappers.

_process_event(method_name, event, event_kw)[source]#

Combines creates an event_dict and runs the chain.

Call it to combine your event and context into an event_dict and process using the processor chain.

Parameters
  • method_name (str) – The name of the logger method. Is passed into the processors.

  • event (Optional[str]) – The event – usually the first positional argument to a logger.

  • event_kw (Dict[str, Any]) – Additional event keywords. For example if someone calls log.msg("foo", bar=42), event would to be "foo" and event_kw {"bar": 42}.

Raises

structlog.DropEvent if log entry should be dropped.

Raises

ValueError if the final processor doesn’t return a str, bytes, bytearray, tuple, or a dict.

Returns

tuple of (*args, **kw)

Return type

Tuple[Sequence[Any], Mapping[str, Any]]

Note

Despite underscore available to custom wrapper classes.

See also Custom Wrappers.

Changed in version 14.0.0: Allow final processor to return a dict.

Changed in version 20.2.0: Allow final processor to return bytes.

Changed in version 21.2.0: Allow final processor to return a bytearray.

_proxy_to_logger(method_name, event=None, **event_kw)[source]#

Run processor chain on event & call method_name on wrapped logger.

DRY convenience method that runs _process_event(), takes care of handling structlog.DropEvent, and finally calls method_name on _logger with the result.

Parameters
  • method_name (str) – The name of the method that’s going to get called. Technically it should be identical to the method the user called because it also get passed into processors.

  • event (Optional[str]) – The event – usually the first positional argument to a logger.

  • event_kw (Any) – Additional event keywords. For example if someone calls log.msg("foo", bar=42), event would to be "foo" and event_kw {"bar": 42}.

Note

Despite underscore available to custom wrapper classes.

See also Custom Wrappers.

bind(**new_values)[source]#

Return a new logger with new_values added to the existing ones.

new(**new_values)[source]#

Clear context and binds initial_values using bind.

Only necessary with dict implementations that keep global state like those wrapped by structlog.threadlocal.wrap_dict when threads are re-used.

unbind(*keys)[source]#

Return a new logger with keys removed from the context.

Raises

KeyError – If the key is not part of the context.

structlog.dev Module#

Helpers that make development with structlog more pleasant.

See also the narrative documentation in Development.

class structlog.dev.ConsoleRenderer(pad_event=30, colors=True, force_colors=False, repr_native_str=False, level_styles=None, exception_formatter=<function plain_traceback>, sort_keys=True)[source]#

Render event_dict nicely aligned, possibly in colors, and ordered.

If event_dict contains a true-ish exc_info key, it will be rendered after the log line. If rich or better-exceptions are present, in colors and with extra context.

Parameters
  • pad_event (int) – Pad the event to this many characters.

  • colors (bool) – Use colors for a nicer output. True by default if colorama is installed.

  • force_colors (bool) – Force colors even for non-tty destinations. Use this option if your logs are stored in a file that is meant to be streamed to the console.

  • repr_native_str (bool) – When True, repr is also applied to native strings (i.e. unicode on Python 3 and bytes on Python 2). Setting this to False is useful if you want to have human-readable non-ASCII output on Python 2. The event key is never repr -ed.

  • level_styles (Optional[Union[structlog.dev._Styles, Type[structlog.dev._Styles]]]) – When present, use these styles for colors. This must be a dict from level names (strings) to colorama styles. The default can be obtained by calling ConsoleRenderer.get_default_level_styles

  • exception_formatter (Callable[[TextIO, Tuple[Type[BaseException], BaseException, Optional[types.TracebackType]]], None]) – A callable to render exc_infos. If rich or better-exceptions are installed, they are used for pretty-printing by default (rich taking precedence). You can also manually set it to plain_traceback, better_traceback, rich_traceback, or implement your own.

  • sort_keys (bool) – Whether to sort keys when formatting. True by default.

Requires the colorama package if colors is True on Windows.

New in version 16.0.

New in version 16.1: colors

New in version 17.1: repr_native_str

New in version 18.1: force_colors

New in version 18.1: level_styles

Changed in version 19.2: colorama now initializes lazily to avoid unwanted initializations as ConsoleRenderer is used by default.

Changed in version 19.2: Can be pickled now.

Changed in version 20.1: colorama does not initialize lazily on Windows anymore because it breaks rendering.

Changed in version 21.1: It is additionally possible to set the logger name using the logger_name key in the event_dict.

New in version 21.2: exception_formatter

Changed in version 21.2: ConsoleRenderer now handles the exc_info event dict key itself. Do not use the structlog.processors.format_exc_info processor together with ConsoleRenderer anymore! It will keep working, but you can’t have customize exception formatting and a warning will be raised if you ask for it.

Changed in version 21.2: The colors keyword now defaults to True on non-Windows systems, and either True or False in Windows depending on whether colorama is installed.

New in version 21.3.0: sort_keys

static get_default_level_styles(colors=True)[source]#

Get the default styles for log levels

This is intended to be used with ConsoleRenderer’s level_styles parameter. For example, if you are adding custom levels in your home-grown add_log_level() you could do:

my_styles = ConsoleRenderer.get_default_level_styles()
my_styles["EVERYTHING_IS_ON_FIRE"] = my_styles["critical"]
renderer = ConsoleRenderer(level_styles=my_styles)
Parameters

colors (bool) – Whether to use colorful styles. This must match the colors parameter to ConsoleRenderer. Default: True.

structlog.dev.plain_traceback(sio, exc_info)[source]#

“Pretty”-print exc_info to sio using our own plain formatter.

To be passed into ConsoleRenderer’s exception_formatter argument.

Used by default if neither rich not better-exceptions are present.

New in version 21.2.

structlog.dev.rich_traceback(sio, exc_info)[source]#

Pretty-print exc_info to sio using the rich package.

To be passed into ConsoleRenderer’s exception_formatter argument.

Used by default if rich is installed.

New in version 21.2.

structlog.dev.better_traceback(sio, exc_info)[source]#

Pretty-print exc_info to sio using the better-exceptions package.

To be passed into ConsoleRenderer’s exception_formatter argument.

Used by default if better-exceptions is installed and rich is absent.

New in version 21.2.

structlog.dev.set_exc_info(logger, method_name, event_dict)[source]#

Set event_dict["exc_info"] = True if method_name is "exception".

Do nothing if the name is different or exc_info is already set.

structlog.testing Module#

Helpers to test your application’s logging behavior.

New in version 20.1.0.

See Testing.

structlog.testing.capture_logs()[source]#

Context manager that appends all logging statements to its yielded list while it is active. Disables all configured processors for the duration of the context manager.

Attention: this is not thread-safe!

New in version 20.1.0.

class structlog.testing.LogCapture[source]#

Class for capturing log messages in its entries list. Generally you should use structlog.testing.capture_logs, but you can use this class if you want to capture logs with other patterns.

Variables

entries (List[structlog.types.EventDict]) – The captured log entries.

New in version 20.1.0.

class structlog.testing.CapturingLogger[source]#

Store the method calls that it’s been called with.

This is nicer than ReturnLogger for unit tests because the bound logger doesn’t have to cooperate.

Any method name is supported.

New in version 20.2.0.

>>> from pprint import pprint
>>> cl = structlog.testing.CapturingLogger()
>>> cl.msg("hello")
>>> cl.msg("hello", when="again")
>>> pprint(cl.calls)
[CapturedCall(method_name='msg', args=('hello',), kwargs={}),
 CapturedCall(method_name='msg', args=('hello',), kwargs={'when': 'again'})]
class structlog.testing.CapturingLoggerFactory[source]#

Produce and cache CapturingLoggers.

Each factory produces and re-uses only one logger.

You can access it via the logger attribute.

To be used with structlog.configure‘s logger_factory.

Positional arguments are silently ignored.

New in version 20.2.0.

class structlog.testing.CapturedCall(method_name, args, kwargs)[source]#

A call as captured by CapturingLogger.

Can also be unpacked like a tuple.

Parameters
  • method_name (str) – The method name that got called.

  • args (Tuple[Any, ...]) – A tuple of the positional arguments.

  • kwargs (Dict[str, Any]) – A dict of the keyword arguments.

New in version 20.2.0.

class structlog.testing.ReturnLogger[source]#

Return the arguments that it’s called with.

>>> from structlog import ReturnLogger
>>> ReturnLogger().msg("hello")
'hello'
>>> ReturnLogger().msg("hello", when="again")
(('hello',), {'when': 'again'})

Changed in version 0.3.0: Allow for arbitrary arguments and keyword arguments to be passed in.

critical(*args, **kw)#

Return tuple of args, kw or just args[0] if only one arg passed

debug(*args, **kw)#

Return tuple of args, kw or just args[0] if only one arg passed

err(*args, **kw)#

Return tuple of args, kw or just args[0] if only one arg passed

error(*args, **kw)#

Return tuple of args, kw or just args[0] if only one arg passed

failure(*args, **kw)#

Return tuple of args, kw or just args[0] if only one arg passed

fatal(*args, **kw)#

Return tuple of args, kw or just args[0] if only one arg passed

info(*args, **kw)#

Return tuple of args, kw or just args[0] if only one arg passed

log(*args, **kw)#

Return tuple of args, kw or just args[0] if only one arg passed

msg(*args, **kw)[source]#

Return tuple of args, kw or just args[0] if only one arg passed

warning(*args, **kw)#

Return tuple of args, kw or just args[0] if only one arg passed

class structlog.testing.ReturnLoggerFactory[source]#

Produce and cache ReturnLoggers.

To be used with structlog.configure‘s logger_factory.

Positional arguments are silently ignored.

New in version 0.4.0.

structlog.contextvars Module#

Primitives to deal with a concurrency supporting context, as introduced in Python 3.7 as contextvars.

New in version 20.1.0.

Changed in version 21.1.0: Reimplemented without using a single dict as context carrier for improved isolation. Every key-value pair is a separate contextvars.ContextVar now.

See Context Variables.

structlog.contextvars.bind_contextvars(**kw)[source]#

Put keys and values into the context-local context.

Use this instead of bind() when you want some context to be global (context-local).

Return the mapping of contextvars.Tokens resulting from setting the backing ContextVars. Suitable for passing to reset_contextvars().

New in version 20.1.0.

Changed in version 21.1.0: Return the contextvars.Token mapping rather than None. See also the toplevel note.

structlog.contextvars.bound_contextvars(**kw)[source]#

Bind kw to the current context-local context. Unbind or restore kw afterwards. Do not affect other keys.

Can be used as a context manager or decorator.

New in version 21.4.0.

structlog.contextvars.get_contextvars()[source]#

Return a copy of the structlog-specific context-local context.

New in version 21.2.0.

structlog.contextvars.get_merged_contextvars(bound_logger)[source]#

Return a copy of the current context-local context merged with the context from bound_logger.

New in version 21.2.0.

structlog.contextvars.merge_contextvars(logger, method_name, event_dict)[source]#

A processor that merges in a global (context-local) context.

Use this as your first processor in structlog.configure() to ensure context-local context is included in all log calls.

New in version 20.1.0.

Changed in version 21.1.0: See toplevel note.

structlog.contextvars.clear_contextvars()[source]#

Clear the context-local context.

The typical use-case for this function is to invoke it early in request- handling code.

New in version 20.1.0.

Changed in version 21.1.0: See toplevel note.

structlog.contextvars.unbind_contextvars(*keys)[source]#

Remove keys from the context-local context if they are present.

Use this instead of unbind() when you want to remove keys from a global (context-local) context.

New in version 20.1.0.

Changed in version 21.1.0: See toplevel note.

structlog.contextvars.reset_contextvars(**kw)[source]#

Reset contextvars corresponding to the given Tokens.

New in version 21.1.0.

structlog.threadlocal Module#

Deprecated primitives to keep context global but thread (and greenlet) local.

See Legacy Thread-local Context, but please use Context Variables instead.

Deprecated since version 22.1.0.

structlog.processors Module#

Processors useful regardless of the logging framework.

class structlog.processors.JSONRenderer(serializer=<function dumps>, **dumps_kw)[source]#

Render the event_dict using serializer(event_dict, **dumps_kw).

Parameters
  • dumps_kw (Any) – Are passed unmodified to serializer. If default is passed, it will disable support for __structlog__-based serialization.

  • serializer (Callable[[...], Union[str, bytes]]) – A json.dumps()-compatible callable that will be used to format the string. This can be used to use alternative JSON encoders like orjson or RapidJSON (default: json.dumps()).

New in version 0.2.0: Support for __structlog__ serialization method.

New in version 15.4.0: serializer parameter.

New in version 18.2.0: Serializer’s default parameter can be overwritten now.

>>> from structlog.processors import JSONRenderer
>>> JSONRenderer(sort_keys=True)(None, None, {"a": 42, "b": [1, 2, 3]})
'{"a": 42, "b": [1, 2, 3]}'

Bound objects are attempted to be serialize using a __structlog__ method. If none is defined, repr() is used:

>>> class C1:
...     def __structlog__(self):
...         return ["C1!"]
...     def __repr__(self):
...         return "__structlog__ took precedence"
>>> class C2:
...     def __repr__(self):
...         return "No __structlog__, so this is used."
>>> from structlog.processors import JSONRenderer
>>> JSONRenderer(sort_keys=True)(None, None, {"c1": C1(), "c2": C2()})
'{"c1": ["C1!"], "c2": "No __structlog__, so this is used."}'

Please note that additionally to strings, you can also return any type the standard library JSON module knows about – like in this example a list.

If you choose to pass a default parameter as part of json_kw, support for __structlog__ is disabled. This can be useful when used together with more elegant serialization methods like functools.singledispatch(): Better Python Object Serialization.

class structlog.processors.KeyValueRenderer(sort_keys=False, key_order=None, drop_missing=False, repr_native_str=True)[source]#

Render event_dict as a list of Key=repr(Value) pairs.

Parameters
  • sort_keys (bool) – Whether to sort keys when formatting.

  • key_order (Optional[Sequence[str]]) – List of keys that should be rendered in this exact order. Missing keys will be rendered as None, extra keys depending on sort_keys and the dict class.

  • drop_missing (bool) – When True, extra keys in key_order will be dropped rather than rendered as None.

  • repr_native_str (bool) – When True, repr() is also applied to native strings. Setting this to False is useful if you want to have human-readable non-ASCII output on Python 2.

New in version 0.2.0: key_order

New in version 16.1.0: drop_missing

New in version 17.1.0: repr_native_str

>>> from structlog.processors import KeyValueRenderer
>>> KeyValueRenderer(sort_keys=True)(None, None, {"a": 42, "b": [1, 2, 3]})
'a=42 b=[1, 2, 3]'
>>> KeyValueRenderer(key_order=["b", "a"])(None, None,
...                                       {"a": 42, "b": [1, 2, 3]})
'b=[1, 2, 3] a=42'
class structlog.processors.LogfmtRenderer(sort_keys=False, key_order=None, drop_missing=False, bool_as_flag=True)[source]#

Render event_dict using the logfmt format.

Parameters
  • sort_keys (bool) – Whether to sort keys when formatting.

  • key_order (Optional[Sequence[str]]) – List of keys that should be rendered in this exact order. Missing keys are rendered with empty values, extra keys depending on sort_keys and the dict class.

  • drop_missing (bool) – When True, extra keys in key_order will be dropped rather than rendered with empty values.

  • bool_as_flag (bool) – When True, render {"flag": True} as flag, instead of flag=true. {"flag": False} is always rendered as flag=false.

Raises

ValueError – If a key contains non printable or space characters.

New in version 21.5.0.

>>> from structlog.processors import LogfmtRenderer
>>> event_dict = {"a": 42, "b": [1, 2, 3], "flag": True}
>>> LogfmtRenderer(sort_keys=True)(None, None, event_dict)
'a=42 b="[1, 2, 3]" flag'
>>> LogfmtRenderer(key_order=["b", "a"], bool_as_flag=False)(None, None, event_dict)
'b="[1, 2, 3]" a=42 flag=true'
structlog.processors.add_log_level(logger, method_name, event_dict)[source]#

Add the log level to the event dict under the level key.

Since that’s just the log method name, this processor works with non-stdlib logging as well. Therefore it’s importable both from structlog.processors as well as from structlog.stdlib.

New in version 15.0.0.

Changed in version 20.2.0: Importable from structlog.processors (additionally to structlog.stdlib).

class structlog.processors.UnicodeDecoder(encoding='utf-8', errors='replace')[source]#

Decode byte string values in event_dict.

Parameters
  • encoding (str) – Encoding to decode from (default: "utf-8").

  • errors (str) – How to cope with encoding errors (default: "replace").

Useful if you’re running Python 3 as otherwise b"abc" will be rendered as 'b"abc"'.

Just put it in the processor chain before the renderer.

New in version 15.4.0.

class structlog.processors.UnicodeEncoder(encoding='utf-8', errors='backslashreplace')[source]#

Encode unicode values in event_dict.

Parameters
  • encoding (str) – Encoding to encode to (default: "utf-8").

  • errors (str) – How to cope with encoding errors (default "backslashreplace").

Useful if you’re running Python 2 as otherwise u"abc" will be rendered as 'u"abc"'.

Just put it in the processor chain before the renderer.

structlog.processors.format_exc_info(logger, name, event_dict)[source]#

Replace an exc_info field by an exception string field:

If event_dict contains the key exc_info, there are two possible behaviors:

  • If the value is a tuple, render it into the key exception.

  • If the value is an Exception render it into the key exception.

  • If the value true but no tuple, obtain exc_info ourselves and render that.

If there is no exc_info key, the event_dict is not touched. This behavior is analogue to the one of the stdlib’s logging.

>>> from structlog.processors import format_exc_info
>>> try:
...     raise ValueError
... except ValueError:
...     format_exc_info(None, None, {"exc_info": True})  
{'exception': 'Traceback (most recent call last):...
class structlog.processors.StackInfoRenderer(additional_ignores=None)[source]#

Add stack information with key stack if stack_info is True.

Useful when you want to attach a stack dump to a log entry without involving an exception and works analogously to the stack_info argument of the Python standard library logging.

Parameters

additional_ignores (Optional[List[str]]) – By default, stack frames coming from structlog are ignored. With this argument you can add additional names that are ignored, before the stack starts being rendered. They are matched using startswith(), so they don’t have to match exactly. The names are used to find the first relevant name, therefore once a frame is found that doesn’t start with structlog or one of additional_ignores, no filtering is applied to subsequent frames.

New in version 0.4.0.

New in version 22.1.0: additional_ignores

class structlog.processors.ExceptionPrettyPrinter(file=None)[source]#

Pretty print exceptions and remove them from the event_dict.

Parameters

file (Optional[TextIO]) – Target file for output (default: sys.stdout).

This processor is mostly for development and testing so you can read exceptions properly formatted.

It behaves like format_exc_info except it removes the exception data from the event dictionary after printing it.

It’s tolerant to having format_exc_info in front of itself in the processor chain but doesn’t require it. In other words, it handles both exception as well as exc_info keys.

New in version 0.4.0.

Changed in version 16.0.0: Added support for passing exceptions as exc_info on Python 3.

class structlog.processors.TimeStamper(fmt=None, utc=True, key='timestamp')[source]#

Add a timestamp to event_dict.

Parameters
  • fmt (Optional[str]) – strftime format string, or "iso" for ISO 8601, or None for a UNIX timestamp.

  • utc (bool) – Whether timestamp should be in UTC or local time.

  • key (str) – Target key in event_dict for added timestamps.

Changed in version 19.2: Can be pickled now.

>>> from structlog.processors import TimeStamper
>>> TimeStamper()(None, None, {})  
{'timestamp': 1378994017}
>>> TimeStamper(fmt="iso")(None, None, {})  
{'timestamp': '2013-09-12T13:54:26.996778Z'}
>>> TimeStamper(fmt="%Y", key="year")(None, None, {})  
{'year': '2013'}
class structlog.processors.CallsiteParameter(value)[source]#

Callsite parameters that can be added to an event dictionary with the structlog.processors.CallsiteParameterAdder processor class.

The string values of the members of this enum will be used as the keys for the callsite parameters in the event dictionary.

New in version 21.5.0.

FILENAME = 'filename'#

The basename part of the full path to the python source file of the callsite.

FUNC_NAME = 'func_name'#

The name of the function that the callsite was in.

LINENO = 'lineno'#

The line number of the callsite.

MODULE = 'module'#

The python module the callsite was in. This mimicks the module attribute of logging.LogRecord objects and will be the basename, without extension, of the full path to the python source file of the callsite.

PATHNAME = 'pathname'#

The full path to the python source file of the callsite.

PROCESS = 'process'#

The ID of the process the callsite was executed in.

PROCESS_NAME = 'process_name'#

The name of the process the callsite was executed in.

THREAD = 'thread'#

The ID of the thread the callsite was executed in.

THREAD_NAME = 'thread_name'#

The name of the thread the callsite was executed in.

class structlog.processors.CallsiteParameterAdder(parameters={<CallsiteParameter.THREAD_NAME: 'thread_name'>, <CallsiteParameter.LINENO: 'lineno'>, <CallsiteParameter.THREAD: 'thread'>, <CallsiteParameter.PATHNAME: 'pathname'>, <CallsiteParameter.MODULE: 'module'>, <CallsiteParameter.PROCESS: 'process'>, <CallsiteParameter.PROCESS_NAME: 'process_name'>, <CallsiteParameter.FILENAME: 'filename'>, <CallsiteParameter.FUNC_NAME: 'func_name'>}, additional_ignores=None)[source]#

Adds parameters of the callsite that an event dictionary originated from to the event dictionary. This processor can be used to enrich events dictionaries with information such as the function name, line number and filename that an event dictionary originated from.

Warning

This processor cannot detect the correct callsite for invocation of async functions.

If the event dictionary has an embedded logging.LogRecord object and did not originate from structlog then the callsite information will be determined from the logging.LogRecord object. For event dictionaries without an embedded logging.LogRecord object the callsite will be determined from the stack trace, ignoring all intra-structlog calls, calls from the logging module, and stack frames from modules with names that start with values in additional_ignores, if it is specified.

The keys used for callsite parameters in the event dictionary are the string values of CallsiteParameter enum members.

Parameters

Note

When used with structlog.stdlib.ProcessorFormatter the most efficient configuration is to either use this processor in foreign_pre_chain of structlog.stdlib.ProcessorFormatter and in processors of structlog.configure, or to use it in processors of structlog.stdlib.ProcessorFormatter without using it in processors of structlog.configure and foreign_pre_chain of structlog.stdlib.ProcessorFormatter.

New in version 21.5.0.

structlog.stdlib Module#

Processors and helpers specific to the logging module from the Python standard library.

See also structlog’s standard library support.

structlog.stdlib.get_logger(*args, **initial_values)[source]#

Only calls structlog.get_logger, but has the correct type hints.

Warning

Does not check whether you’ve configured structlog correctly!

See Standard Library Logging for details.

New in version 20.2.0.

class structlog.stdlib.BoundLogger(logger, processors, context)[source]#

Python Standard Library version of structlog.BoundLogger.

Works exactly like the generic one except that it takes advantage of knowing the logging methods in advance.

Use it like:

structlog.configure(
    wrapper_class=structlog.stdlib.BoundLogger,
)

It also contains a bunch of properties that pass-through to the wrapped logging.Logger which should make it work as a drop-in replacement.

bind(**new_values)[source]#

Return a new logger with new_values added to the existing ones.

critical(event=None, *args, **kw)[source]#

Process event and call logging.Logger.critical with the result.

debug(event=None, *args, **kw)[source]#

Process event and call logging.Logger.debug with the result.

error(event=None, *args, **kw)[source]#

Process event and call logging.Logger.error with the result.

exception(event=None, *args, **kw)[source]#

Process event and call logging.Logger.error with the result, after setting exc_info to True.

info(event=None, *args, **kw)[source]#

Process event and call logging.Logger.info with the result.

log(level, event=None, *args, **kw)[source]#

Process event and call the appropriate logging method depending on level.

new(**new_values)[source]#

Clear context and binds initial_values using bind.

Only necessary with dict implementations that keep global state like those wrapped by structlog.threadlocal.wrap_dict when threads are re-used.

try_unbind(*keys)[source]#

Like unbind(), but best effort: missing keys are ignored.

New in version 18.2.0.

unbind(*keys)[source]#

Return a new logger with keys removed from the context.

Raises

KeyError – If the key is not part of the context.

warn(event=None, *args, **kw)#

Process event and call logging.Logger.warning with the result.

warning(event=None, *args, **kw)[source]#

Process event and call logging.Logger.warning with the result.

class structlog.stdlib.AsyncBoundLogger(logger, processors, context, *, _sync_bl=None, _loop=None)[source]#

Wraps a BoundLogger & exposes its logging methods as async versions.

Instead of blocking the program, they are run asynchronously in a thread pool executor.

This means more computational overhead per log call. But it also means that the processor chain (e.g. JSON serialization) and I/O won’t block your whole application.

Only available for Python 3.7 and later.

Variables

sync_bl (structlog.stdlib.BoundLogger) – The wrapped synchronous logger. It is useful to be able to log synchronously occasionally.

New in version 20.2.0.

Changed in version 20.2.0: fix _dispatch_to_sync contextvars usage

class structlog.stdlib.LoggerFactory(ignore_frame_names=None)[source]#

Build a standard library logger when an instance is called.

Sets a custom logger using logging.setLoggerClass() so variables in log format are expanded properly.

>>> from structlog import configure
>>> from structlog.stdlib import LoggerFactory
>>> configure(logger_factory=LoggerFactory())
Parameters

ignore_frame_names (Optional[List[str]]) – When guessing the name of a logger, skip frames whose names start with one of these. For example, in pyramid applications you’ll want to set it to ["venusian", "pyramid.config"]. This argument is called additional_ignores in other APIs throughout structlog.

__call__(*args)[source]#

Deduce the caller’s module name and create a stdlib logger.

If an optional argument is passed, it will be used as the logger name instead of guesswork. This optional argument would be passed from the structlog.get_logger() call. For example structlog.get_logger("foo") would cause this method to be called with "foo" as its first positional argument.

Changed in version 0.4.0: Added support for optional positional arguments. Using the first one for naming the constructed logger.

structlog.stdlib.render_to_log_kwargs(_, __, event_dict)[source]#

Render event_dict into keyword arguments for logging.log.

The event field is translated into msg and the rest of the event_dict is added as extra.

This allows you to defer formatting to logging.

New in version 17.1.0.

structlog.stdlib.filter_by_level(logger, method_name, event_dict)[source]#

Check whether logging is configured to accept messages from this log level.

Should be the first processor if stdlib’s filtering by level is used so possibly expensive processors like exception formatters are avoided in the first place.

>>> import logging
>>> from structlog.stdlib import filter_by_level
>>> logging.basicConfig(level=logging.WARN)
>>> logger = logging.getLogger()
>>> filter_by_level(logger, 'warn', {})
{}
>>> filter_by_level(logger, 'debug', {})
Traceback (most recent call last):
...
DropEvent
structlog.stdlib.add_log_level(logger, method_name, event_dict)[source]#

Add the log level to the event dict under the level key.

Since that’s just the log method name, this processor works with non-stdlib logging as well. Therefore it’s importable both from structlog.processors as well as from structlog.stdlib.

New in version 15.0.0.

Changed in version 20.2.0: Importable from structlog.processors (additionally to structlog.stdlib).

structlog.stdlib.add_log_level_number(logger, method_name, event_dict)[source]#

Add the log level number to the event dict.

Log level numbers map to the log level names. The Python stdlib uses them for filtering logic. This adds the same numbers so users can leverage similar filtering. Compare:

level in ("warning", "error", "critical")
level_number >= 30

The mapping of names to numbers is in structlog.stdlib._log_levels._NAME_TO_LEVEL.

New in version 18.2.0.

structlog.stdlib.add_logger_name(logger, method_name, event_dict)[source]#

Add the logger name to the event dict.

structlog.stdlib.ExtraAdder(allow=None)[source]#

Add extra attributes of logging.LogRecord objects to the event dictionary.

This processor can be used for adding data passed in the extra parameter of the logging module’s log methods to the event dictionary.

Parameters

allow (Optional[Collection[str]]) –

An optional collection of attributes that, if present in logging.LogRecord objects, will be copied to event dictionaries.

If allow is None all attributes of logging.LogRecord objects that do not exist on a standard logging.LogRecord object will be copied to event dictionaries.

New in version 21.5.0.

class structlog.stdlib.PositionalArgumentsFormatter(remove_positional_args=True)[source]#

Apply stdlib-like string formatting to the event key.

If the positional_args key in the event dict is set, it must contain a tuple that is used for formatting (using the %s string formatting operator) of the value from the event key. This works in the same way as the stdlib handles arguments to the various log methods: if the tuple contains only a single dict argument it is used for keyword placeholders in the event string, otherwise it will be used for positional placeholders.

positional_args is populated by structlog.stdlib.BoundLogger or can be set manually.

The remove_positional_args flag can be set to False to keep the positional_args key in the event dict; by default it will be removed from the event dict after formatting a message.

class structlog.stdlib.ProcessorFormatter(processor=None, processors=(), foreign_pre_chain=None, keep_exc_info=False, keep_stack_info=False, logger=None, pass_foreign_args=False, *args, **kwargs)[source]#

Call structlog processors on logging.LogRecords.

This is an implementation of a logging.Formatter that can be used to format log entries from both structlog and logging.

Its static method wrap_for_formatter must be the final processor in structlog’s processor chain.

Please refer to Rendering Using structlog-based Formatters Within logging for examples.

Parameters
Raises

TypeError – If both or neither processor and processors are passed.

New in version 17.1.0.

New in version 17.2.0: keep_exc_info and keep_stack_info

New in version 19.2.0: logger

New in version 19.2.0: pass_foreign_args

New in version 21.3.0: processors

Deprecated since version 21.3.0: processor (singular) in favor of processors (plural). Removal is not planned.

static remove_processors_meta(_, __, event_dict)[source]#

Remove _record and _from_structlog from event_dict.

These keys are added to the event dictionary, before ProcessorFormatter’s processors are run.

New in version 21.3.0.

static wrap_for_formatter(logger, name, event_dict)[source]#

Wrap logger, name, and event_dict.

The result is later unpacked by ProcessorFormatter when formatting log entries.

Use this static method as the renderer (i.e. final processor) if you want to use ProcessorFormatter in your logging configuration.

structlog.types Module#

Type information used throughout structlog.

For now, they are considered provisional. Especially BindableLogger will probably change to something more elegant.

New in version 20.2.

class structlog.types.BindableLogger(*args, **kwargs)[source]#

Protocol: Methods shared among all bound loggers and that are relied on by structlog.

New in version 20.2.

Additionally to the methods listed below, bound loggers must have a __init__ method with the following signature:

__init__(self, wrapped_logger: WrappedLogger, processors: Iterable[Processor], context: Context) None

Unfortunately it’s impossible to define initializers using PEP 544 Protocols.

They currently also have to carry a Context as a _context attribute.

Note

Currently Sphinx has no support for Protocols, so please click [source] for this entry to see the full definition.

class structlog.types.FilteringBoundLogger(*args, **kwargs)[source]#

Protocol: A BindableLogger that filters by a level.

The only way to instantiate one is using make_filtering_bound_logger.

New in version 20.2.0.

Note

Currently Sphinx has no support for Protocols, so please click [source] for this entry to see the full definition.

structlog.types.EventDict#

An event dictionary as it is passed into processors.

It’s created by copying the configured Context but doesn’t need to support copy itself.

New in version 20.2.

alias of MutableMapping[str, Any]

structlog.types.WrappedLogger = typing.Any#

A logger that is wrapped by a bound logger and is ultimately responsible for the output of the log entries.

structlog makes no assumptions about it.

New in version 20.2.

structlog.types.Processor#

A callable that is part of the processor chain.

See Processors.

New in version 20.2.

alias of Callable[[Any, str, MutableMapping[str, Any]], Union[Mapping[str, Any], str, bytes, bytearray, Tuple[Any, …]]]

structlog.types.Context#

A dict-like context carrier.

New in version 20.2.

alias of Union[Dict[str, Any], Dict[Any, Any]]

structlog.types.ExcInfo#

An exception info tuple as returned by sys.exc_info.

New in version 20.2.

alias of Tuple[Type[BaseException], BaseException, Optional[types.TracebackType]]

structlog.types.ExceptionFormatter#

A callable that pretty-prints an ExcInfo into a file-like object.

Used by structlog.dev.ConsoleRenderer.

New in version 21.2.

alias of Callable[[TextIO, Tuple[Type[BaseException], BaseException, Optional[types.TracebackType]]], None]

structlog.twisted Module#

Processors and tools specific to the Twisted networking engine.

See also structlog’s Twisted support.

class structlog.twisted.BoundLogger(logger, processors, context)[source]#

Twisted-specific version of structlog.BoundLogger.

Works exactly like the generic one except that it takes advantage of knowing the logging methods in advance.

Use it like:

configure(
    wrapper_class=structlog.twisted.BoundLogger,
)
bind(**new_values)#

Return a new logger with new_values added to the existing ones.

err(event=None, **kw)[source]#

Process event and call log.err() with the result.

msg(event=None, **kw)[source]#

Process event and call log.msg() with the result.

new(**new_values)#

Clear context and binds initial_values using bind.

Only necessary with dict implementations that keep global state like those wrapped by structlog.threadlocal.wrap_dict when threads are re-used.

unbind(*keys)#

Return a new logger with keys removed from the context.

Raises

KeyError – If the key is not part of the context.

class structlog.twisted.LoggerFactory[source]#

Build a Twisted logger when an instance is called.

>>> from structlog import configure
>>> from structlog.twisted import LoggerFactory
>>> configure(logger_factory=LoggerFactory())
__call__(*args)[source]#

Positional arguments are silently ignored.

Rvalue

A new Twisted logger.

Changed in version 0.4.0: Added support for optional positional arguments.

class structlog.twisted.EventAdapter(dictRenderer=None)[source]#

Adapt an event_dict to Twisted logging system.

Particularly, make a wrapped twisted.python.log.err behave as expected.

Parameters

dictRenderer (Optional[Callable[[Any, str, MutableMapping[str, Any]], str]]) – Renderer that is used for the actual log message. Please note that structlog comes with a dedicated JSONRenderer.

Must be the last processor in the chain and requires a dictRenderer for the actual formatting as an constructor argument in order to be able to fully support the original behaviors of log.msg() and log.err().

class structlog.twisted.JSONRenderer(serializer=<function dumps>, **dumps_kw)[source]#

Behaves like structlog.processors.JSONRenderer except that it formats tracebacks and failures itself if called with err().

Note

This ultimately means that the messages get logged out using msg(), and not err() which renders failures in separate lines.

Therefore it will break your tests that contain assertions using flushLoggedErrors.

Not an adapter like EventAdapter but a real formatter. Also does not require to be adapted using it.

Use together with a JSONLogObserverWrapper-wrapped Twisted logger like plainJSONStdOutLogger for pure-JSON logs.

structlog.twisted.plainJSONStdOutLogger()[source]#

Return a logger that writes only the message to stdout.

Transforms non-JSONRenderer messages to JSON.

Ideal for JSONifying log entries from Twisted plugins and libraries that are outside of your control:

$ twistd -n --logger structlog.twisted.plainJSONStdOutLogger web
{"event": "Log opened.", "system": "-"}
{"event": "twistd 13.1.0 (python 2.7.3) starting up.", "system": "-"}
{"event": "reactor class: twisted...EPollReactor.", "system": "-"}
{"event": "Site starting on 8080", "system": "-"}
{"event": "Starting factory <twisted.web.server.Site ...>", ...}
...

Composes PlainFileLogObserver and JSONLogObserverWrapper to a usable logger.

New in version 0.2.0.

structlog.twisted.JSONLogObserverWrapper(observer)[source]#

Wrap a log observer and render non-JSONRenderer entries to JSON.

Parameters

observer (ILogObserver) – Twisted log observer to wrap. For example PlainFileObserver or Twisted’s stock FileLogObserver

New in version 0.2.0.

class structlog.twisted.PlainFileLogObserver(file)[source]#

Write only the the plain message without timestamps or anything else.

Great to just print JSON to stdout where you catch it with something like runit.

Parameters

file (TextIO) – File to print to.

New in version 0.2.0.