@@ -44,18 +44,40 @@ def __eq__(self, __o: _T) -> _T:
4444return_eq = _ReturnEq ()
4545
4646
47+ class LoguruHandler (logging .Handler ):
48+ def emit (self , record : logging .LogRecord ):
49+ try :
50+ level = logger .level (record .levelname ).name
51+ if record .levelno <= logging .INFO :
52+ level = {"DEBUG" : "TRACE" , "INFO" : "DEBUG" }.get (level , level )
53+ except ValueError :
54+ level = record .levelno
55+
56+ frame , depth = sys ._getframe (6 ), 6
57+ while frame and frame .f_code .co_filename == logging .__file__ :
58+ frame = frame .f_back
59+ depth += 1
60+
61+ logger .opt (depth = depth , exception = record .exc_info ).log (
62+ level , record .getMessage ()
63+ )
64+
65+
4766class StreamToLogger (StringIO ):
48- """Use for startup migrate only"""
67+ """Use for startup migrate, AlembicConfig.print_stdout() only"""
4968
5069 def __init__ (self , level = "INFO" ):
5170 self ._level = level
5271
53- def write (self , buffer ):
72+ def write (self , buffer : str ):
73+ frame , depth = sys ._getframe (3 ), 3
74+ while frame and frame .f_code .co_name != "print_stdout" :
75+ frame = frame .f_back
76+ depth += 1
77+ depth += 1
78+
5479 for line in buffer .rstrip ().splitlines ():
55- # depth 0: this function
56- # depth 1: click.echo()
57- # depth 2: click.secho()
58- logger .opt (depth = 3 ).log (self ._level , line .rstrip ())
80+ logger .opt (depth = depth ).log (self ._level , line .rstrip ())
5981
6082 def flush (self ):
6183 pass
@@ -64,9 +86,9 @@ def flush(self):
6486def return_progressbar (func : Callable [_P , Iterable [_T ]]) -> Callable [_P , Iterable [_T ]]:
6587 log_level = get_driver ().config .log_level
6688 if isinstance (log_level , str ):
67- log_level = logging . getLevelName (log_level )
89+ log_level = logger . level (log_level ). no
6890
69- if log_level <= logging . INFO :
91+ if log_level <= logger . level ( " INFO" ). no :
7092 return func
7193
7294 @wraps (func )
0 commit comments