11import logging
2- import reprlib
3- from uuid import uuid4
4- from logging import Logger
5- from typing import Optional , Callable
62from functools import wraps
7- from essentials .diagnostics import StopWatch
83from inspect import iscoroutinefunction
4+ from logging import Logger
5+ from typing import Callable , Optional
6+ from uuid import uuid4
97
8+ from essentials .diagnostics import StopWatch
109
1110IdFactory = Callable [[], str ]
1211
@@ -15,22 +14,24 @@ def _default_id_factory():
1514 return str (uuid4 ())
1615
1716
18- def log (logger : Optional [Logger ] = None ,
19- id_factory : Optional [IdFactory ] = None ,
20- log_arguments : bool = False ,
21- log_return_value : bool = False ,
22- level = logging .INFO ,
23- call_msg = '%s; called; call id: %s' ,
24- call_msg_with_input = '%s; called; call id: %s; args: %s; kwargs: %s' ,
25- completed_msg = '%s; completed; call id: %s; elapsed %s ms' ,
26- completed_msg_with_output = '%s; completed; call id: %s; elapsed %s ms; output: %s' ,
27- exc_message = '%s; unhandled exception; call id: %s; elapsed %s ms' ):
17+ def log (
18+ logger : Optional [Logger ] = None ,
19+ id_factory : Optional [IdFactory ] = None ,
20+ log_arguments : bool = False ,
21+ log_return_value : bool = False ,
22+ level = logging .INFO ,
23+ call_msg = "%s; called; call id: %s" ,
24+ call_msg_with_input = "%s; called; call id: %s; args: %s; kwargs: %s" ,
25+ completed_msg = "%s; completed; call id: %s; elapsed %s ms" ,
26+ completed_msg_with_output = "%s; completed; call id: %s; elapsed %s ms; output: %s" ,
27+ exc_message = "%s; unhandled exception; call id: %s; elapsed %s ms" ,
28+ ):
2829
2930 if not id_factory :
3031 id_factory = _default_id_factory
3132
3233 if logger is None :
33- logger = logging .getLogger (f' fn_calls' )
34+ logger = logging .getLogger (f" fn_calls" )
3435
3536 def before (name , fn , args , kwargs ):
3637 function_call_id = id_factory ()
@@ -44,19 +45,31 @@ def before(name, fn, args, kwargs):
4445
4546 def on_exception (name , stop_watch , exc , function_call_id ):
4647 stop_watch .stop ()
47- logger .exception (exc_message , name , function_call_id , stop_watch .elapsed_ms , exc_info = exc )
48+ logger .exception (
49+ exc_message , name , function_call_id , stop_watch .elapsed_ms , exc_info = exc
50+ )
4851
4952 def after (name , stop_watch , function_call_id , value ):
5053 if log_return_value :
51- logger .log (level , completed_msg_with_output , name , function_call_id , stop_watch .elapsed_ms , value )
54+ logger .log (
55+ level ,
56+ completed_msg_with_output ,
57+ name ,
58+ function_call_id ,
59+ stop_watch .elapsed_ms ,
60+ value ,
61+ )
5262 else :
53- logger .log (level , completed_msg , name , function_call_id , stop_watch .elapsed_ms )
63+ logger .log (
64+ level , completed_msg , name , function_call_id , stop_watch .elapsed_ms
65+ )
5466
5567 def log_decorator (fn ):
5668 nonlocal logger
57- name = fn .__module__ + '.' + fn .__name__
69+ name = fn .__module__ + "." + fn .__name__
5870
5971 if iscoroutinefunction (fn ):
72+
6073 @wraps (fn )
6174 async def async_wrapper (* args , ** kwargs ):
6275 function_call_id = before (name , fn , args , kwargs )
@@ -88,4 +101,5 @@ def wrapper(*args, **kwargs):
88101 return value
89102
90103 return wrapper
104+
91105 return log_decorator
0 commit comments