diff --git a/releasenotes/notes/logging-protocol-a4cf0f786f21e4ee.yaml b/releasenotes/notes/logging-protocol-a4cf0f786f21e4ee.yaml new file mode 100644 index 0000000..ad8206d --- /dev/null +++ b/releasenotes/notes/logging-protocol-a4cf0f786f21e4ee.yaml @@ -0,0 +1,5 @@ +--- +other: + - | + Accept non-standard logger in helpers logging something (eg: structlog, loguru...) + diff --git a/tenacity/_utils.py b/tenacity/_utils.py index f11a088..be14871 100644 --- a/tenacity/_utils.py +++ b/tenacity/_utils.py @@ -25,6 +25,18 @@ MAX_WAIT = sys.maxsize / 2 +class LoggerProtocol(typing.Protocol): + """ + Protocol used by utils expecting a logger (eg: before_log). + + Compatible with logging, structlog, loguru, etc... + """ + + def log( + self, level: int, msg: str, /, *args: typing.Any, **kwargs: typing.Any + ) -> typing.Any: ... + + def find_ordinal(pos_num: int) -> str: # See: https://en.wikipedia.org/wiki/English_numerals#Ordinal_numbers if pos_num == 0: diff --git a/tenacity/after.py b/tenacity/after.py index 1735b0b..a4b8922 100644 --- a/tenacity/after.py +++ b/tenacity/after.py @@ -19,8 +19,6 @@ from tenacity import _utils if typing.TYPE_CHECKING: - import logging - from tenacity import RetryCallState @@ -29,7 +27,7 @@ def after_nothing(retry_state: "RetryCallState") -> None: def after_log( - logger: "logging.Logger", + logger: _utils.LoggerProtocol, log_level: int, sec_format: str = "%.3g", ) -> typing.Callable[["RetryCallState"], None]: diff --git a/tenacity/before.py b/tenacity/before.py index 366235a..5d9aa24 100644 --- a/tenacity/before.py +++ b/tenacity/before.py @@ -19,8 +19,6 @@ from tenacity import _utils if typing.TYPE_CHECKING: - import logging - from tenacity import RetryCallState @@ -29,7 +27,7 @@ def before_nothing(retry_state: "RetryCallState") -> None: def before_log( - logger: "logging.Logger", log_level: int + logger: _utils.LoggerProtocol, log_level: int ) -> typing.Callable[["RetryCallState"], None]: """Before call strategy that logs to some logger the attempt.""" diff --git a/tenacity/before_sleep.py b/tenacity/before_sleep.py index d71ea8e..a822cb8 100644 --- a/tenacity/before_sleep.py +++ b/tenacity/before_sleep.py @@ -19,8 +19,6 @@ from tenacity import _utils if typing.TYPE_CHECKING: - import logging - from tenacity import RetryCallState @@ -29,7 +27,7 @@ def before_sleep_nothing(retry_state: "RetryCallState") -> None: def before_sleep_log( - logger: "logging.Logger", + logger: _utils.LoggerProtocol, log_level: int, exc_info: bool = False, sec_format: str = "%.3g",