diff --git a/tenacity/_utils.py b/tenacity/_utils.py index 6a12678b..195fa504 100644 --- a/tenacity/_utils.py +++ b/tenacity/_utils.py @@ -32,9 +32,7 @@ class LoggerProtocol(typing.Protocol): Compatible with logging, structlog, loguru, etc... """ - def log( - self, level: int, msg: str, *args: typing.Any, **kwargs: typing.Any - ) -> typing.Any: ... + def log(self, level: int, msg: str, *args: typing.Any) -> typing.Any: ... def find_ordinal(pos_num: int) -> str: diff --git a/tenacity/before_sleep.py b/tenacity/before_sleep.py index 6b691212..13d5656d 100644 --- a/tenacity/before_sleep.py +++ b/tenacity/before_sleep.py @@ -14,6 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import traceback import typing from tenacity import _utils @@ -35,8 +36,6 @@ def before_sleep_log( """Before sleep strategy that logs to some logger the attempt.""" def log_it(retry_state: "RetryCallState") -> None: - local_exc_info: BaseException | bool | None - if retry_state.outcome is None: raise RuntimeError("log_it() called before outcome was set") @@ -46,22 +45,22 @@ def log_it(retry_state: "RetryCallState") -> None: if retry_state.outcome.failed: ex = retry_state.outcome.exception() verb, value = "raised", f"{ex.__class__.__name__}: {ex}" - - if exc_info: - local_exc_info = retry_state.outcome.exception() - else: - local_exc_info = False else: verb, value = "returned", retry_state.outcome.result() - local_exc_info = False # exc_info does not apply when no exception fn_name = retry_state.get_fn_name() - logger.log( - log_level, + msg = ( f"Retrying {fn_name} " - f"in {sec_format % retry_state.next_action.sleep} seconds as it {verb} {value}.", - exc_info=local_exc_info, + f"in {sec_format % retry_state.next_action.sleep} seconds as it {verb} {value}." ) + if exc_info and retry_state.outcome.failed: + ex = retry_state.outcome.exception() + if ex is not None: + tb = "".join(traceback.format_exception(type(ex), ex, ex.__traceback__)) + msg = f"{msg}\n{tb.rstrip()}" + + logger.log(log_level, msg) + return log_it