11
11
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
# See the License for the specific language governing permissions and
13
13
# limitations under the License.
14
-
14
+ import logging
15
15
import random
16
16
import sys
17
17
import time
@@ -82,6 +82,7 @@ def __init__(
82
82
wait_jitter_max = None ,
83
83
before_attempts = None ,
84
84
after_attempts = None ,
85
+ logger = None ,
85
86
):
86
87
87
88
self ._stop_max_attempt_number = (
@@ -109,6 +110,14 @@ def __init__(
109
110
self ._wait_jitter_max = 0 if wait_jitter_max is None else wait_jitter_max
110
111
self ._before_attempts = before_attempts
111
112
self ._after_attempts = after_attempts
113
+
114
+ if logger in (True , None ):
115
+ self ._logger = logging .getLogger (__name__ )
116
+ if logger is None :
117
+ self ._logger .addHandler (logging .NullHandler ())
118
+ self ._logger .propagate = False
119
+ elif logger :
120
+ self ._logger = logger
112
121
113
122
# TODO add chaining of stop behaviors
114
123
# stop behavior
@@ -255,6 +264,7 @@ def call(self, fn, *args, **kwargs):
255
264
if not self .should_reject (attempt ):
256
265
return attempt .get (self ._wrap_exception )
257
266
267
+ self ._logger .warn (attempt )
258
268
if self ._after_attempts :
259
269
self ._after_attempts (attempt_number )
260
270
@@ -270,6 +280,7 @@ def call(self, fn, *args, **kwargs):
270
280
if self ._wait_jitter_max :
271
281
jitter = random .random () * self ._wait_jitter_max
272
282
sleep = sleep + max (0 , jitter )
283
+ self ._logger .info (f"Retrying in { sleep / 1000.0 :.2f} seconds." )
273
284
time .sleep (sleep / 1000.0 )
274
285
275
286
attempt_number += 1
0 commit comments