@@ -138,7 +138,9 @@ def format(self, record):
138138_FILE_FORMAT = logging .Formatter (
139139 "%(asctime)s | %(levelname)-8s | %(name)s:%(funcName)s:%(lineno)d | %(message)s"
140140)
141- _std_logger = logging .getLogger ("maante" )
141+ _APP_LOGGER_NAME = "maante"
142+ _ROOT_LOGGER = logging .getLogger ()
143+ _NOISY_LOGGER_NAMES = ("cv2" , "numpy" , "PIL" , "matplotlib" , "urllib3" , "asyncio" )
142144
143145
144146def _resolve_level (level ) -> int :
@@ -147,6 +149,15 @@ def _resolve_level(level) -> int:
147149 return getattr (logging , str (level ).upper (), logging .INFO )
148150
149151
152+ def _configure_noisy_loggers ():
153+ for name in _NOISY_LOGGER_NAMES :
154+ logging .getLogger (name ).setLevel (logging .WARNING )
155+
156+
157+ def get_logger (name = None ):
158+ return logging .getLogger (name or _APP_LOGGER_NAME )
159+
160+
150161def _setup_loguru_logger (log_dir = "debug/custom" , console_level = "INFO" ):
151162 os .makedirs (log_dir , exist_ok = True )
152163 _loguru_logger .remove ()
@@ -172,25 +183,26 @@ def _setup_loguru_logger(log_dir="debug/custom", console_level="INFO"):
172183 filter = _enrich_record ,
173184 )
174185
175- logging .root .handlers = [_InterceptHandler ()]
176- logging .root .setLevel (logging .DEBUG )
177- for name in ("cv2" , "numpy" , "PIL" , "matplotlib" , "urllib3" , "asyncio" ):
178- logging .getLogger (name ).setLevel (logging .WARNING )
186+ _ROOT_LOGGER .handlers = [_InterceptHandler ()]
187+ _ROOT_LOGGER .setLevel (logging .DEBUG )
188+ _configure_noisy_loggers ()
179189
180- return _loguru_logger
190+ app_logger = get_logger (_APP_LOGGER_NAME )
191+ app_logger .setLevel (logging .NOTSET )
192+ app_logger .propagate = True
193+ return app_logger
181194
182195
183196def _setup_std_logger (log_dir = "debug/custom" , console_level = "INFO" ):
184197 os .makedirs (log_dir , exist_ok = True )
185198
186- _std_logger .handlers .clear ()
187- _std_logger .setLevel (logging .DEBUG )
188- _std_logger .propagate = False
199+ _ROOT_LOGGER .handlers .clear ()
200+ _ROOT_LOGGER .setLevel (logging .DEBUG )
189201
190202 console_handler = logging .StreamHandler (_resolve_console_stream ())
191203 console_handler .setLevel (_resolve_level (console_level ))
192204 console_handler .setFormatter (_ConsoleFormatter ())
193- _std_logger .addHandler (console_handler )
205+ _ROOT_LOGGER .addHandler (console_handler )
194206
195207 file_handler = TimedRotatingFileHandler (
196208 os .path .join (log_dir , "runtime.log" ),
@@ -201,13 +213,18 @@ def _setup_std_logger(log_dir="debug/custom", console_level="INFO"):
201213 )
202214 file_handler .setLevel (logging .DEBUG )
203215 file_handler .setFormatter (_FILE_FORMAT )
204- _std_logger .addHandler (file_handler )
216+ _ROOT_LOGGER .addHandler (file_handler )
217+
218+ _configure_noisy_loggers ()
205219
206- return _std_logger
220+ app_logger = get_logger (_APP_LOGGER_NAME )
221+ app_logger .setLevel (logging .NOTSET )
222+ app_logger .propagate = True
223+ return app_logger
207224
208225
209226def setup_logger (log_dir = "debug/custom" , console_level = "INFO" ):
210- """设置 logger(优先 loguru,无 loguru 时回退到标准 logging)"""
227+ """设置统一 logger(优先 loguru,无 loguru 时回退到标准 logging)"""
211228 if _HAS_LOGURU :
212229 return _setup_loguru_logger (log_dir = log_dir , console_level = console_level )
213230 return _setup_std_logger (log_dir = log_dir , console_level = console_level )
@@ -219,6 +236,7 @@ def change_console_level(level="DEBUG"):
219236 logger .info (f"控制台日志等级已更改为: { level } " )
220237
221238
222- logger = setup_logger (console_level = "WARNING" if _is_mxu_client () else "INFO" )
239+ setup_logger (console_level = "WARNING" if _is_mxu_client () else "INFO" )
240+ logger = get_logger (_APP_LOGGER_NAME )
223241
224- __all__ = ["setup_logger" , "change_console_level" , "logger" ]
242+ __all__ = ["setup_logger" , "change_console_level" , "get_logger" , " logger" ]
0 commit comments