From dadac80ef1c86a0a20d80d35c0f970633e1b8b54 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Tue, 9 Apr 2019 16:50:24 +0200 Subject: [PATCH 1/5] Allow for exception_formatter=None --- loguru/_handler.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/loguru/_handler.py b/loguru/_handler.py index 5afd66ef..24b8bb41 100644 --- a/loguru/_handler.py +++ b/loguru/_handler.py @@ -93,12 +93,12 @@ def emit(self, record, level_color, ansi_message, raw): formatter_record = record.copy() - if not record["exception"]: - error = "" - else: + if record["exception"] and self._exception_formatter: type_, value, tb = record["exception"] lines = self._exception_formatter.format_exception(type_, value, tb) error = "".join(lines) + else: + error = "" formatter_record["exception"] = error From 1c7c7a41af21058d10f49603ee434a932aafb96b Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Tue, 9 Apr 2019 17:03:02 +0200 Subject: [PATCH 2/5] Add exception_formatter kwarg to logger.add --- loguru/_logger.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/loguru/_logger.py b/loguru/_logger.py index d93c36b4..238aedef 100644 --- a/loguru/_logger.py +++ b/loguru/_logger.py @@ -32,6 +32,8 @@ start_time = now() +UNSET = object() + class Logger: """An object to dispatch logging messages to configured handlers. @@ -163,6 +165,7 @@ def add( diagnose=_defaults.LOGURU_DIAGNOSE, enqueue=_defaults.LOGURU_ENQUEUE, catch=_defaults.LOGURU_CATCH, + exception_formatter=UNSET, **kwargs ): r"""Add a handler sending log messages to a sink adequately configured. @@ -201,6 +204,8 @@ def add( Whether or not errors occurring while sink handles logs messages should be caught or not. If ``True``, an exception message is displayed on |sys.stderr| but the exception is not propagated to the caller, preventing your app to crash. + exception_formatter : |ExceptionFormatter|, optional + By default ``loguru._better_exceptions.ExceptionFormatter`` is used. **kwargs Additional parameters that will be passed to the sink while creating it or while logging messages (the exact behavior depends on the sink type). @@ -762,13 +767,14 @@ def filter_func(r): handler_id = next(self._handlers_count) colors = [lvl.color for lvl in self._levels.values()] + [""] - exception_formatter = ExceptionFormatter( - colorize=colorize, - encoding=encoding, - diagnose=diagnose, - backtrace=backtrace, - hidden_frames_filename=self.catch.__code__.co_filename, - ) + if exception_formatter is UNSET: + exception_formatter = ExceptionFormatter( + colorize=colorize, + encoding=encoding, + diagnose=diagnose, + backtrace=backtrace, + hidden_frames_filename=self.catch.__code__.co_filename, + ) handler = Handler( writer=writer, From cb43c842edcf95d5e87f5fddf0285ee891427814 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Tue, 9 Apr 2019 17:27:20 +0200 Subject: [PATCH 3/5] Move instantiation of exception_formatter up --- loguru/_logger.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/loguru/_logger.py b/loguru/_logger.py index 238aedef..b452008f 100644 --- a/loguru/_logger.py +++ b/loguru/_logger.py @@ -743,6 +743,23 @@ def filter_func(r): "Invalid level value, it should be a positive integer, not: %d" % levelno ) + try: + encoding = sink.encoding + except AttributeError: + encoding = None + + if not encoding: + encoding = "ascii" + + if exception_formatter is UNSET: + exception_formatter = ExceptionFormatter( + colorize=colorize, + encoding=encoding, + diagnose=diagnose, + backtrace=backtrace, + hidden_frames_filename=self.catch.__code__.co_filename, + ) + if isinstance(format, str): formatter = format + "\n{exception}" is_formatter_dynamic = False @@ -755,27 +772,10 @@ def filter_func(r): % type(format).__name__ ) - try: - encoding = sink.encoding - except AttributeError: - encoding = None - - if not encoding: - encoding = "ascii" - with self._lock: handler_id = next(self._handlers_count) colors = [lvl.color for lvl in self._levels.values()] + [""] - if exception_formatter is UNSET: - exception_formatter = ExceptionFormatter( - colorize=colorize, - encoding=encoding, - diagnose=diagnose, - backtrace=backtrace, - hidden_frames_filename=self.catch.__code__.co_filename, - ) - handler = Handler( writer=writer, stopper=stopper, From 4fec4a491a26fb6204c7b0bd46c217fbf4bbe129 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Tue, 9 Apr 2019 17:33:32 +0200 Subject: [PATCH 4/5] Logger.add: append exception to formatter only with exception formatter --- loguru/_logger.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/loguru/_logger.py b/loguru/_logger.py index b452008f..38d47711 100644 --- a/loguru/_logger.py +++ b/loguru/_logger.py @@ -761,7 +761,9 @@ def filter_func(r): ) if isinstance(format, str): - formatter = format + "\n{exception}" + formatter = format + if exception_formatter: + formatter += "\n{exception}" is_formatter_dynamic = False elif callable(format): formatter = format From e99e482c05f803ccc78dab6f76d00dd3ea5ba3a0 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Tue, 9 Apr 2019 18:30:34 +0200 Subject: [PATCH 5/5] add test_handler_with_no_exception_formatter --- tests/test_formatting.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/test_formatting.py b/tests/test_formatting.py index 59eb8096..f3a78f13 100644 --- a/tests/test_formatting.py +++ b/tests/test_formatting.py @@ -121,3 +121,20 @@ def test_extra_formatting(writer): def test_invalid_color_markup(writer): with pytest.raises(AnsiMarkupError): logger.add(writer, format="Not closed tag", colorize=True) + + +def test_handler_with_no_exception_formatter(): + class Handler: + def write(self, message): + assert message == "got_exception" + self.passed_write = True + + handler = Handler() + logger.add(handler, format="{message}", catch=False, exception_formatter=None) + assert [x._exception_formatter for x in logger._handlers.values()] == [None] + try: + raise ValueError + except Exception: + logger.exception("got_exception") + + assert handler.passed_write is True