Source code for structlog.testing
# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the MIT License. See the LICENSE file in the root of this
# repository for complete details.
"""
Helpers to test your application's logging behavior.
.. versionadded:: 20.1.0
See :doc:`testing`.
"""
from contextlib import contextmanager
from ._config import configure, get_config
from .exceptions import DropEvent
__all__ = ["LogCapture", "capture_logs"]
[docs]class LogCapture(object):
"""
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.
.. versionadded:: 20.1.0
"""
def __init__(self):
self.entries = []
def __call__(self, _, method_name, event_dict):
event_dict["log_level"] = method_name
self.entries.append(event_dict)
raise DropEvent
[docs]@contextmanager
def capture_logs():
"""
Context manager that appends all logging statements to its yielded list
while it is active.
Attention: this is **not** thread-safe!
.. versionadded:: 20.1.0
"""
cap = LogCapture()
old_processors = get_config()["processors"]
try:
configure(processors=[cap])
yield cap.entries
finally:
configure(processors=old_processors)
[docs]class ReturnLoggerFactory(object):
r"""
Produce and cache `ReturnLogger`\ s.
To be used with `structlog.configure`\ 's *logger_factory*.
Positional arguments are silently ignored.
.. versionadded:: 0.4.0
"""
def __init__(self):
self._logger = ReturnLogger()
def __call__(self, *args):
return self._logger
[docs]class ReturnLogger(object):
"""
Return the arguments that it's called with.
>>> from structlog import ReturnLogger
>>> ReturnLogger().msg("hello")
'hello'
>>> ReturnLogger().msg("hello", when="again")
(('hello',), {'when': 'again'})
.. versionchanged:: 0.3.0
Allow for arbitrary arguments and keyword arguments to be passed in.
"""
[docs] def msg(self, *args, **kw):
"""
Return tuple of ``args, kw`` or just ``args[0]`` if only one arg passed
"""
# Slightly convoluted for backwards compatibility.
if len(args) == 1 and not kw:
return args[0]
else:
return args, kw
log = debug = info = warn = warning = msg
fatal = failure = err = error = critical = exception = msg