Skip to content

Commit f31e640

Browse files
committed
fix(realtime): 修复服务号实时同步写入解密库并优化桌面端运行时兼容性
服务号实时同步改为直接读取 live biz_message 库,避免 gh_* 会话走空的 wcdb_get_messages。 将同步结果写回 output/databases 解密库,并补充异常降级路径。 修复桌面端日志处理与 wcdb_api.dll 的运行时定位问题。
1 parent 9ffdd26 commit f31e640

File tree

3 files changed

+424
-230
lines changed

3 files changed

+424
-230
lines changed

src/wechat_decrypt_tool/logging_config.py

Lines changed: 64 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
4460
class 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

Comments
 (0)