@@ -53,9 +53,9 @@ def __new__(cls):
5353 return cls ._instance
5454
5555 def __init__ (self ):
56- if not self . _initialized :
57- self . setup_logging ()
58- WeChatLogger . _initialized = True
56+ # Lazy-init in `setup_logging()` / accessors to avoid double-initialization when
57+ # callers instantiate the manager and then call ` setup_logging()` again.
58+ pass
5959
6060 def setup_logging (self , log_level : str = "INFO" ):
6161 """设置日志配置"""
@@ -66,7 +66,9 @@ def setup_logging(self, log_level: str = "INFO"):
6666
6767 # 创建日志目录
6868 now = datetime .now ()
69- log_dir = Path ("output/logs" ) / str (now .year ) / f"{ now .month :02d} " / f"{ now .day :02d} "
69+ from .app_paths import get_output_dir
70+
71+ log_dir = get_output_dir () / "logs" / str (now .year ) / f"{ now .month :02d} " / f"{ now .day :02d} "
7072 log_dir .mkdir (parents = True , exist_ok = True )
7173
7274 # 设置日志文件名
@@ -77,6 +79,10 @@ def setup_logging(self, log_level: str = "INFO"):
7779 root_logger = logging .getLogger ()
7880 for handler in root_logger .handlers [:]:
7981 root_logger .removeHandler (handler )
82+ try :
83+ handler .close ()
84+ except Exception :
85+ pass
8086
8187 # 配置日志格式
8288 # 文件格式(无颜色)
@@ -109,22 +115,48 @@ def setup_logging(self, log_level: str = "INFO"):
109115
110116 # 只为uvicorn日志器添加文件处理器,保持其原有的控制台处理器(带颜色)
111117 uvicorn_logger = logging .getLogger ("uvicorn" )
118+ for handler in uvicorn_logger .handlers [:]:
119+ if isinstance (handler , logging .FileHandler ):
120+ uvicorn_logger .removeHandler (handler )
121+ try :
122+ handler .close ()
123+ except Exception :
124+ pass
112125 uvicorn_logger .addHandler (file_handler )
113126 uvicorn_logger .setLevel (level )
114127
115128 # 只为uvicorn.access日志器添加文件处理器
116129 uvicorn_access_logger = logging .getLogger ("uvicorn.access" )
130+ for handler in uvicorn_access_logger .handlers [:]:
131+ if isinstance (handler , logging .FileHandler ):
132+ uvicorn_access_logger .removeHandler (handler )
133+ try :
134+ handler .close ()
135+ except Exception :
136+ pass
117137 uvicorn_access_logger .addHandler (file_handler )
118138 uvicorn_access_logger .setLevel (level )
119139
120140 # 只为uvicorn.error日志器添加文件处理器
121141 uvicorn_error_logger = logging .getLogger ("uvicorn.error" )
142+ for handler in uvicorn_error_logger .handlers [:]:
143+ if isinstance (handler , logging .FileHandler ):
144+ uvicorn_error_logger .removeHandler (handler )
145+ try :
146+ handler .close ()
147+ except Exception :
148+ pass
122149 uvicorn_error_logger .addHandler (file_handler )
123150 uvicorn_error_logger .setLevel (level )
124151
125152 # 配置FastAPI日志器
126153 fastapi_logger = logging .getLogger ("fastapi" )
127- fastapi_logger .handlers = []
154+ for handler in fastapi_logger .handlers [:]:
155+ fastapi_logger .removeHandler (handler )
156+ try :
157+ handler .close ()
158+ except Exception :
159+ pass
128160 fastapi_logger .addHandler (file_handler )
129161 fastapi_logger .addHandler (console_handler )
130162 fastapi_logger .setLevel (level )
@@ -136,6 +168,8 @@ def setup_logging(self, log_level: str = "INFO"):
136168 logger .info (f"日志文件: { self .log_file } " )
137169 logger .info (f"日志级别: { logging .getLevelName (level )} " )
138170 logger .info ("=" * 60 )
171+
172+ WeChatLogger ._initialized = True
139173
140174 return self .log_file
141175
@@ -145,6 +179,8 @@ def get_logger(self, name: str) -> logging.Logger:
145179
146180 def get_log_file_path (self ) -> Path :
147181 """获取当前日志文件路径"""
182+ if not hasattr (self , "log_file" ):
183+ self .setup_logging ()
148184 return self .log_file
149185
150186
@@ -157,10 +193,14 @@ def setup_logging(log_level: str = "INFO") -> Path:
157193def get_logger (name : str ) -> logging .Logger :
158194 """获取日志器的便捷函数"""
159195 logger_manager = WeChatLogger ()
196+ if not WeChatLogger ._initialized :
197+ logger_manager .setup_logging ()
160198 return logger_manager .get_logger (name )
161199
162200
163201def get_log_file_path () -> Path :
164202 """获取当前日志文件路径的便捷函数"""
165203 logger_manager = WeChatLogger ()
204+ if not WeChatLogger ._initialized :
205+ logger_manager .setup_logging ()
166206 return logger_manager .get_log_file_path ()
0 commit comments