Skip to content

Commit

Permalink
Add new "diagnose" argument to split the "backtrace" behavior (#49)
Browse files Browse the repository at this point in the history
  • Loading branch information
Delgan committed Mar 31, 2019
1 parent cac17f3 commit 99c636f
Show file tree
Hide file tree
Showing 78 changed files with 150 additions and 843 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
Unreleased
==========

- Change the behavior of ``backtrace`` argument so it only extends the stacktrace upward, the display of variables values is now controlled with the new ``diagnose`` argument (`#49 <https://github.com/Delgan/loguru/issues/49>`_)
- The ``record["exception"]`` attribute is now unpackable as a ``(type, value, traceback)`` tuple


Expand Down
2 changes: 1 addition & 1 deletion README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ Logging exceptions that occur in your code is important to track bugs, but it's

The code::

logger.add("output.log", backtrace=True) # Set 'False' to avoid leaking sensitive data in prod
logger.add("output.log", backtrace=True, diagnose=True) # Set 'False' to not leak sensitive data in prod

def func(a, b):
return a / b
Expand Down
2 changes: 1 addition & 1 deletion docs/resources/migration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ Replacing ``exc_info`` argument

While calling standard logging function, you can pass ``exc_info`` as an argument to add stacktrace to the message. Instead of that, you should use the |opt| method with ``exception`` parameter, replacing ``logger.debug("Debug error:", exc_info=True)`` with ``logger.opt(exception=True).debug("Debug error:")``.

The formatted exception will include the whole stacktrace and variables. To prevent that, make sure to use ``backtrace=False`` while adding your sink.
The formatted exception will include the whole stacktrace and variables. To prevent that, make sure to use ``backtrace=False`` and ``diagnose=False`` while adding your sink.


Replacing ``extra`` argument and ``LoggerAdapter`` objects
Expand Down
1 change: 1 addition & 0 deletions loguru/_defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def env(key, type_, default=None):
LOGURU_COLORIZE = env("LOGURU_COLORIZE", bool, None)
LOGURU_SERIALIZE = env("LOGURU_SERIALIZE", bool, False)
LOGURU_BACKTRACE = env("LOGURU_BACKTRACE", bool, True)
LOGURU_DIAGNOSE = env("LOGURU_DIAGNOSE", bool, True)
LOGURU_ENQUEUE = env("LOGURU_ENQUEUE", bool, False)
LOGURU_CATCH = env("LOGURU_CATCH", bool, True)

Expand Down
18 changes: 13 additions & 5 deletions loguru/_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ def __init__(
colorize,
serialize,
backtrace,
diagnose,
catch,
enqueue,
encoding,
Expand All @@ -42,6 +43,7 @@ def __init__(
self._colorize = colorize
self._serialize = serialize
self._backtrace = backtrace
self._diagnose = diagnose
self._catch = catch
self._enqueue = enqueue
self._encoding = encoding
Expand Down Expand Up @@ -102,17 +104,23 @@ def emit(self, record, level_color, ansi_message, raw, decorated):

exception = record["exception"]

if exception:
if not exception:
error = ""
else:
type_, value, tb = exception

if self._backtrace:
tb = self._exception_extender.extend_traceback(tb, decorated=decorated)

if self._diagnose:
lines = self._exception_formatter.format_exception(type_, value, tb)
error = self._exception_extender.reformat("".join(lines))
else:
lines = traceback.format_exception(type_, value, tb)
error = "".join(lines)
else:
error = ""

error = "".join(lines)

if self._backtrace:
error = self._exception_extender.reformat(error)

formatter_record = {**record, **{"exception": error}}

Expand Down
17 changes: 12 additions & 5 deletions loguru/_logger.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ def add(
colorize=_defaults.LOGURU_COLORIZE,
serialize=_defaults.LOGURU_SERIALIZE,
backtrace=_defaults.LOGURU_BACKTRACE,
diagnose=_defaults.LOGURU_DIAGNOSE,
enqueue=_defaults.LOGURU_ENQUEUE,
catch=_defaults.LOGURU_CATCH,
**kwargs
Expand All @@ -184,9 +185,12 @@ def add(
Whether or not the logged message and its records should be first converted to a JSON
string before being sent to the sink.
backtrace : |bool|, optional
Whether or not the formatted exception should use stack trace to display local variables
values and be extended upward beyond the caught frame. This probably should be set to
``False`` in production to avoid leaking sensitive data.
Whether or not the exception trace formatted should be extended upward, beyond the
catching point, to show the full stacktrace which generated the error.
diagnose : |bool|, optional
Whether or not the exception trace should display the variables values to eases the
debugging. This should be set to ``False`` in production to avoid leaking sensitive
data.
enqueue : |bool|, optional
Whether or not the messages to be logged should first pass through a multiprocess-safe
queue before reaching the sink. This is useful while logging to a file through multiple
Expand Down Expand Up @@ -540,7 +544,7 @@ def add(
Each of the |add| default parameter can be modified by setting the ``LOGURU_[PARAM]``
environment variable. For example on Linux: ``export LOGURU_FORMAT="{time} - {message}"``
or ``export LOGURU_BACKTRACE=NO``.
or ``export LOGURU_DIAGNOSE=NO``.
The default levels' attributes can also be modified by setting the ``LOGURU_[LEVEL]_[ATTR]``
environment variable. For example, on Windows: ``setx LOGURU_DEBUG_COLOR "<blue>"``
Expand Down Expand Up @@ -592,6 +596,7 @@ def add(
colorize=colorize,
serialize=serialize,
backtrace=backtrace,
diagnose=diagnose,
enqueue=enqueue,
catch=catch,
)
Expand All @@ -606,6 +611,7 @@ def add(
colorize=colorize,
serialize=serialize,
backtrace=backtrace,
diagnose=diagnose,
enqueue=enqueue,
catch=catch,
)
Expand Down Expand Up @@ -764,6 +770,7 @@ def filter_func(r):
colorize=colorize,
serialize=serialize,
backtrace=backtrace,
diagnose=diagnose,
catch=catch,
enqueue=enqueue,
encoding=encoding,
Expand Down Expand Up @@ -836,7 +843,7 @@ def catch(
using threads to propagate errors to the main logger thread.
Note that the visibility of variables values (which uses the cool `better_exceptions`_
library from `@Qix-`_) depends on the ``backtrace`` option of each configured sink.
library from `@Qix-`_) depends on the ``diagnose`` option of each configured sink.
The returned object can also be used as a context manager.
Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/chained_expression_direct.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)


@logger.catch()
Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/chained_expression_indirect.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)


def a():
Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/chaining_first.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)


@logger.catch
Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/chaining_second.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)


def a_decorator():
Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/chaining_third.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)


def a_decorator():
Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/enqueue.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, enqueue=True, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, enqueue=True, format="", colorize=False, backtrace=True, diagnose=False)

try:
1 / 0
Expand Down
6 changes: 3 additions & 3 deletions tests/exceptions/backtrace/enqueue_with_others_handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ def check_tb_sink(message):

logger.remove()

logger.add(check_tb_sink, enqueue=False, catch=False)
logger.add(sys.stderr, enqueue=True, catch=False, format="")
logger.add(check_tb_sink, enqueue=False, catch=False)
logger.add(check_tb_sink, enqueue=False, catch=False, backtrace=True, diagnose=False)
logger.add(sys.stderr, format="", enqueue=True, catch=False, backtrace=True, diagnose=False)
logger.add(check_tb_sink, enqueue=False, catch=False, backtrace=True, diagnose=False)

try:
1 / 0
Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/frame_values_backward.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)

k = 2

Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/frame_values_forward.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)

k = 2

Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/function.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)


@logger.catch()
Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/head_recursion.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)


@logger.catch()
Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/nested.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)


def a(x):
Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/nested_wrapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)


def f(i):
Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/no_tb.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="{message}", colorize=False, backtrace=True)
logger.add(sys.stderr, format="{message}", colorize=False, backtrace=True, diagnose=False)


def f():
Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/not_enough_arguments.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)


@logger.catch
Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/raising_recursion.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)


@logger.catch
Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/suppressed_expression_direct.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)


def a(x, y):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)


def a(x, y):
Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/tail_recursion.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)


@logger.catch()
Expand Down
2 changes: 1 addition & 1 deletion tests/exceptions/backtrace/too_many_arguments.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True)
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)


@logger.catch
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=True, backtrace=True)
logger.add(sys.stderr, format="", colorize=True, backtrace=False, diagnose=True)


def foo(abc, xyz):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=True, backtrace=True)
logger.add(sys.stderr, format="", colorize=True, backtrace=False, diagnose=True)


class Obj:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=True, backtrace=True)
logger.add(sys.stderr, format="", colorize=True, backtrace=False, diagnose=True)


def div(x, y):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=True, backtrace=True)
logger.add(sys.stderr, format="", colorize=True, backtrace=False, diagnose=True)


def _deep(val):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=True, backtrace=True)
logger.add(sys.stderr, format="", colorize=True, backtrace=False, diagnose=True)


foo = True
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=True, backtrace=True)
logger.add(sys.stderr, format="", colorize=True, backtrace=False, diagnose=True)


code = """
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=True, backtrace=True)
logger.add(sys.stderr, format="", colorize=True, backtrace=False, diagnose=True)


class A:
Expand Down
Loading

0 comments on commit 99c636f

Please sign in to comment.