@@ -41,6 +41,22 @@ def format(self, record):
4141 return formatted
4242
4343
44+ def _can_use_logging_stream (stream ) -> bool :
45+ try :
46+ if stream is None or getattr (stream , "closed" , False ):
47+ return False
48+ except Exception :
49+ return False
50+
51+ try :
52+ stream .write ("" )
53+ stream .flush ()
54+ except Exception :
55+ return False
56+
57+ return True
58+
59+
4460class WeChatLogger :
4561 """微信解密工具统一日志管理器"""
4662
@@ -64,6 +80,12 @@ def setup_logging(self, log_level: str = "INFO"):
6480 if env_level :
6581 log_level = env_level
6682
83+ console_logging_env = str (os .environ .get ("WECHAT_TOOL_ENABLE_CONSOLE_LOG" , "" ) or "" ).strip ().lower ()
84+ console_logging_forced = console_logging_env in {"1" , "true" , "yes" , "on" }
85+ console_logging_disabled = console_logging_env in {"0" , "false" , "no" , "off" }
86+
87+ level = getattr (logging , str (log_level or "INFO" ).upper (), logging .INFO )
88+
6789 # 创建日志目录
6890 now = datetime .now ()
6991 from .app_paths import get_output_dir
@@ -73,10 +95,41 @@ def setup_logging(self, log_level: str = "INFO"):
7395
7496 # 设置日志文件名
7597 date_str = now .strftime ("%d" )
76- self .log_file = log_dir / f"{ date_str } _wechat_tool.log"
98+ desired_log_file = log_dir / f"{ date_str } _wechat_tool.log"
99+
100+ root_logger = logging .getLogger ()
101+ wants_console_handler = _can_use_logging_stream (sys .stdout )
102+ if getattr (sys , "frozen" , False ) and not console_logging_forced :
103+ wants_console_handler = False
104+ if console_logging_disabled :
105+ wants_console_handler = False
106+
107+ if WeChatLogger ._initialized :
108+ current_log_file = Path (getattr (self , "log_file" , desired_log_file ))
109+ has_expected_file_handler = False
110+ has_stream_handler = False
111+ for handler in root_logger .handlers :
112+ if isinstance (handler , logging .FileHandler ):
113+ try :
114+ if Path (handler .baseFilename ).resolve () == desired_log_file .resolve ():
115+ has_expected_file_handler = True
116+ except Exception :
117+ if Path (handler .baseFilename ) == desired_log_file :
118+ has_expected_file_handler = True
119+ elif isinstance (handler , logging .StreamHandler ):
120+ has_stream_handler = True
121+ if (
122+ current_log_file == desired_log_file
123+ and root_logger .level == level
124+ and has_expected_file_handler
125+ and (has_stream_handler or not wants_console_handler )
126+ ):
127+ self .log_file = desired_log_file
128+ return self .log_file
129+
130+ self .log_file = desired_log_file
77131
78132 # 清除现有的处理器
79- root_logger = logging .getLogger ()
80133 for handler in root_logger .handlers [:]:
81134 root_logger .removeHandler (handler )
82135 try :
@@ -100,18 +153,20 @@ def setup_logging(self, log_level: str = "INFO"):
100153 # 文件处理器
101154 file_handler = logging .FileHandler (self .log_file , encoding = 'utf-8' )
102155 file_handler .setFormatter (file_formatter )
103- level = getattr (logging , str (log_level or "INFO" ).upper (), logging .INFO )
104156 file_handler .setLevel (level )
105157
106158 # 控制台处理器
107- console_handler = logging .StreamHandler (sys .stdout )
108- console_handler .setFormatter (console_formatter )
109- console_handler .setLevel (level )
159+ console_handler = None
160+ if wants_console_handler :
161+ console_handler = logging .StreamHandler (sys .stdout )
162+ console_handler .setFormatter (console_formatter )
163+ console_handler .setLevel (level )
110164
111165 # 配置根日志器
112166 root_logger .setLevel (level )
113167 root_logger .addHandler (file_handler )
114- root_logger .addHandler (console_handler )
168+ if console_handler is not None :
169+ root_logger .addHandler (console_handler )
115170
116171 # 只为uvicorn日志器添加文件处理器,保持其原有的控制台处理器(带颜色)
117172 uvicorn_logger = logging .getLogger ("uvicorn" )
@@ -158,7 +213,8 @@ def setup_logging(self, log_level: str = "INFO"):
158213 except Exception :
159214 pass
160215 fastapi_logger .addHandler (file_handler )
161- fastapi_logger .addHandler (console_handler )
216+ if console_handler is not None :
217+ fastapi_logger .addHandler (console_handler )
162218 fastapi_logger .setLevel (level )
163219
164220 # 记录初始化信息
0 commit comments