From f350dfb23cdf16d80a611aa808f18fbc4cd95e56 Mon Sep 17 00:00:00 2001 From: yuhldr Date: Fri, 20 Sep 2024 17:17:21 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20debug=E4=BF=A1=E6=81=AF=E8=B0=83?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/resources/meson.build | 2 +- lfy.in | 2 + lfy/api/server/bing.py | 3 ++ lfy/api/server/com.py | 2 + lfy/api/server/google.py | 5 ++- lfy/api/server/ocr/easyocr.py | 3 ++ lfy/api/server/ocr/pytesseract.py | 5 ++- lfy/api/utils/bak.py | 2 + lfy/api/utils/check_update.py | 17 ++++---- lfy/api/utils/debug.py | 69 +++++++++++++++++++++++++++++++ lfy/code.py | 3 ++ lfy/main.py | 9 ++-- lfy/translate.py | 3 ++ lfy/widgets/server_preferences.py | 4 +- 14 files changed, 112 insertions(+), 17 deletions(-) create mode 100644 lfy/api/utils/debug.py diff --git a/data/resources/meson.build b/data/resources/meson.build index 47dcb3d..c010b36 100644 --- a/data/resources/meson.build +++ b/data/resources/meson.build @@ -36,7 +36,7 @@ metainfo = i18n.merge_file( output: APP_ID + '.metainfo.xml', po_dir: join_paths(meson.project_source_root(), 'po'), install: true, - install_dir: join_paths(get_option('prefix'), get_option('datadir'), 'resources') + install_dir: join_paths(get_option('prefix'), get_option('datadir'), 'metainfo') ) diff --git a/lfy.in b/lfy.in index ab4e5e8..c1b17c1 100755 --- a/lfy.in +++ b/lfy.in @@ -49,6 +49,8 @@ def set_internationalization(): locale.bindtextdomain(APP_ID, LOCALE_DIR) locale.textdomain(APP_ID) except AttributeError as e: + from lfy.api.utils.debug import get_logger + get_logger().error(e) print(f"Some gettext translations will not work. Error:\n{e}") gettext.bindtextdomain(APP_ID, LOCALE_DIR) diff --git a/lfy/api/server/bing.py b/lfy/api/server/bing.py index 746f118..3dd3002 100644 --- a/lfy/api/server/bing.py +++ b/lfy/api/server/bing.py @@ -9,6 +9,7 @@ from requests import RequestException from lfy.api.server import TIME_OUT, Server +from lfy.api.utils.debug import get_logger def _init_session(): @@ -83,6 +84,7 @@ def translate_text(self, text, lang_to="zh-cn", lang_from="auto", n=0): hs = self.session.headers print(hs["my_host"]) except RequestException as e: + get_logger().error(e) print("bing-session", n, type(e), e) return self.translate_text(text, lang_to, lang_from, n + 1) @@ -103,6 +105,7 @@ def translate_text(self, text, lang_to="zh-cn", lang_from="auto", n=0): try: response = self.session.post(url, data=data, timeout=TIME_OUT) except RequestException as e: + get_logger().error(e) print("bing-post", n, type(e), e) return self.translate_text(text, lang_to, lang_from, n + 1) diff --git a/lfy/api/server/com.py b/lfy/api/server/com.py index 4c3ce09..9c19740 100644 --- a/lfy/api/server/com.py +++ b/lfy/api/server/com.py @@ -7,6 +7,7 @@ from lfy.api.server import (Server, aliyun, baidu, bing, google, huoshan, tencent) +from lfy.api.utils.debug import get_logger from lfy.settings import Settings @@ -28,6 +29,7 @@ def _translate(args): em = _("something error:") em = f"{em}{server.name}\n\n" em = f"{em}{str(e)}\n\n{traceback.format_exc()}" + get_logger().error(e) return False, em, server, time.time()-st diff --git a/lfy/api/server/google.py b/lfy/api/server/google.py index 31b389d..89b8296 100644 --- a/lfy/api/server/google.py +++ b/lfy/api/server/google.py @@ -8,6 +8,7 @@ from requests import ConnectTimeout, RequestException from lfy.api.server import TIME_OUT, Server +from lfy.api.utils.debug import get_logger def _get_session(): @@ -56,7 +57,7 @@ def translate_text(self, text, lang_to="zh-cn", lang_from="auto", n=0): str: _description_ """ - if n > 5: + if n > 3: raise ValueError(_("something error, try other translate engine?")) text = text.replace("#", "") @@ -69,9 +70,11 @@ def translate_text(self, text, lang_to="zh-cn", lang_from="auto", n=0): response = self.session.post(url, params=params, data={'q': text}, timeout=TIME_OUT) except ConnectTimeout as e0: print("google0", n, type(e0), e0) + get_logger().error(e0) return False, _("The connection timed out. Maybe there is a network problem") except RequestException as e: print("google", n, type(e), e) + get_logger().error(e) return self.translate_text(text, lang_to, lang_from, n + 1) s = "" diff --git a/lfy/api/server/ocr/easyocr.py b/lfy/api/server/ocr/easyocr.py index e87b856..314bb57 100644 --- a/lfy/api/server/ocr/easyocr.py +++ b/lfy/api/server/ocr/easyocr.py @@ -1,4 +1,6 @@ +'ocr' from lfy.api.server import Server +from lfy.api.utils.debug import get_logger class EasyOcrServer(Server): @@ -36,4 +38,5 @@ def ocr_image(self, img_path: str, lang_keys=None): return True, s.strip() except ModuleNotFoundError as e: print(e) + get_logger().error(e) return False, "请安装 easyocr\n" + str(e) diff --git a/lfy/api/server/ocr/pytesseract.py b/lfy/api/server/ocr/pytesseract.py index a603145..4acebdb 100644 --- a/lfy/api/server/ocr/pytesseract.py +++ b/lfy/api/server/ocr/pytesseract.py @@ -1,5 +1,6 @@ - +'ocr本地' from lfy.api.server import Server +from lfy.api.utils.debug import get_logger def lib_ok(): @@ -13,6 +14,7 @@ def lib_ok(): return True except ModuleNotFoundError as e: print(e) + get_logger().error(e) return False @@ -56,4 +58,5 @@ def ocr_image(self, img_path: str, lang_keys=None): return True, pytesseract.image_to_string(img_path, lang=s) except ModuleNotFoundError as e: print(e) + get_logger().error(e) return False, "请安装 pytesseract\n" + str(e) diff --git a/lfy/api/utils/bak.py b/lfy/api/utils/bak.py index e84ca0c..b889a45 100644 --- a/lfy/api/utils/bak.py +++ b/lfy/api/utils/bak.py @@ -5,6 +5,7 @@ from gi.repository import Gio, GLib from lfy import APP_ID # pylint: disable=E0611 +from lfy.api.utils.debug import get_logger from lfy.settings import Settings @@ -58,4 +59,5 @@ def restore_gsettings(s): except Exception as e: # pylint: disable=W0718 print(e) + get_logger().error(e) return _('Please copy the configuration data in json format first') diff --git a/lfy/api/utils/check_update.py b/lfy/api/utils/check_update.py index c60d8ba..deda29d 100644 --- a/lfy/api/utils/check_update.py +++ b/lfy/api/utils/check_update.py @@ -1,12 +1,11 @@ """更新 """ -import logging - import requests from lfy import PACKAGE_URL, VERSION # pylint: disable=E0611 from lfy.api.server import TIME_OUT +from lfy.api.utils.debug import get_logger def get_by_gitee(): @@ -20,13 +19,13 @@ def get_by_gitee(): try: request = requests.get(url, timeout=TIME_OUT) if request.status_code == 200: - logging.info("gitee update msg ok") + get_logger().info("gitee update msg ok") return request.json() except requests.exceptions.ConnectTimeout as e: - logging.error(e) + get_logger().error(e) return {} except Exception as e: # pylint: disable=W0718 - logging.error(e) + get_logger().error(e) return None @@ -41,13 +40,13 @@ def get_by_github(): try: request = requests.get(url, timeout=TIME_OUT) if request.status_code == 200: - logging.info("github update msg ok") + get_logger().info("github update msg ok") return request.json() except requests.exceptions.ConnectTimeout as e: - logging.error(e) + get_logger().error(e) return {} except Exception as e: # pylint: disable=W0718 - logging.error(e) + get_logger().error(e) return None @@ -99,5 +98,5 @@ def main(): return None # pylint: disable=W0718 except Exception as e: - logging.error(e) + get_logger().error(e) return error_config diff --git a/lfy/api/utils/debug.py b/lfy/api/utils/debug.py new file mode 100644 index 0000000..007175d --- /dev/null +++ b/lfy/api/utils/debug.py @@ -0,0 +1,69 @@ +'错误缓存' +import logging + + +class InMemoryLogHandler(logging.Handler): + """创建一个内存中的日志处理器 + + Args: + logging (_type_): _description_ + """ + + def __init__(self, max_logs=20): + super().__init__() + self.log_buffer = [] + self.max_logs = max_logs + + def emit(self, record): + log_entry = self.format(record) + if len(self.log_buffer) >= self.max_logs: + # 如果日志超过最大限制,删除最旧的日志 + self.log_buffer.pop(0) + self.log_buffer.append(log_entry) + + def get_logs(self): + """获取日志 + + Returns: + str: _description_ + """ + return "\n\n".join(self.log_buffer) + + +# 初始化日志系统 +logger = logging.getLogger("lfy") +logger.setLevel(logging.DEBUG) + +# 设置格式 +formatter = logging.Formatter( + '%(asctime)s - %(levelname)s\n[%(filename)s:%(lineno)d]\n%(message)s') +# 使用自定义内存日志处理器 +in_memory_handler = InMemoryLogHandler(max_logs=10) +in_memory_handler.setFormatter(formatter) +logger.addHandler(in_memory_handler) + +# 测试日志输出 +# for i in range(15): +# logger.info(f"Log message {i}") + +# 打印当前的内存日志 +# print("Current logs:") +# print(in_memory_handler.get_logs()) + + +def get_logger(): + """提供给外部的接口 + + Returns: + _type_: _description_ + """ + return logger + + +def get_log_handler(): + """获取当前的内存日志 + + Returns: + _type_: _description_ + """ + return in_memory_handler diff --git a/lfy/code.py b/lfy/code.py index 4d58c1c..233c788 100644 --- a/lfy/code.py +++ b/lfy/code.py @@ -1,3 +1,4 @@ +'终端翻译' import os import traceback from gettext import gettext as _ @@ -5,6 +6,7 @@ from gi.repository import Gdk from lfy.api import create_server_t, get_lang, server_key2i +from lfy.api.utils.debug import get_logger from lfy.settings import Settings @@ -37,6 +39,7 @@ def req_text(s): print(text) except Exception as e: # pylint: disable=W0718 + get_logger().error(e) error_msg = _("something error:") error_msg2 = f"{str(e)}\n\n{traceback.format_exc()}" text = f"{error_msg}{tran_server.name}\n\n{error_msg2}" diff --git a/lfy/main.py b/lfy/main.py index 4e9f48d..bb6cec3 100644 --- a/lfy/main.py +++ b/lfy/main.py @@ -12,6 +12,7 @@ from lfy.api.utils import is_text from lfy.api.utils.bak import backup_gsettings from lfy.api.utils.check_update import main as check_update +from lfy.api.utils.debug import get_log_handler from lfy.preference import PreferenceWindow from lfy.settings import Settings from lfy.translate import TranslateWindow @@ -101,7 +102,6 @@ def on_about_action(self, _widget, _w): """ # pylint: disable=E1101 path = f'{RES_PATH}/{self._application_id}.metainfo.xml' - print(path) ad = Adw.AboutDialog.new_from_appdata(path, VERSION) ad.set_developers(['yuh , 2023-2023']) @@ -124,9 +124,12 @@ def on_about_action(self, _widget, _w): if "server-sk-" in k and ("key" not in v or "Key" not in v): v = "******" ss[k] = v - s += f"\n\n******* config *******\n" + s += "\n\n******* config *******\n" s += json.dumps(ss, indent=4, ensure_ascii=False) - s += f"\n************" + s += "\n************" + + s += "\n\n******* debug log *******\n" + s += get_log_handler().get_logs() ad.set_debug_info(s) diff --git a/lfy/translate.py b/lfy/translate.py index 3c89b89..e49b1d2 100644 --- a/lfy/translate.py +++ b/lfy/translate.py @@ -14,6 +14,7 @@ from lfy.api.constant import NO_TRANSLATED_TXTS from lfy.api.server import Server from lfy.api.utils import cal_md5 +from lfy.api.utils.debug import get_logger from lfy.api.utils.notify import nf_t from lfy.settings import Settings from lfy.widgets.theme_switcher import ThemeSwitcher @@ -283,6 +284,7 @@ def request_text(self, s, server, lk=None): _ok, text = server.translate_text(s, lk) except Exception as e: # pylint: disable=W0718 + get_logger().error(e) error_msg = _("something error:") error_msg2 = f"{str(e)}\n\n{traceback.format_exc()}" text = f"{error_msg}{server.name}\n\n{error_msg2}" @@ -315,6 +317,7 @@ def update_ui(self, s="", ocr=False): nf_t(self.app, f"{self.tran_server.name} " + _("Translation completed"), s) except TypeError as e: + get_logger().error(e) error_msg = _("something error:") error_msg2 = f"{str(e)}\n\n{traceback.format_exc()}" em = f"{error_msg}\n\n{error_msg2}" diff --git a/lfy/widgets/server_preferences.py b/lfy/widgets/server_preferences.py index f4049fa..0cc1425 100644 --- a/lfy/widgets/server_preferences.py +++ b/lfy/widgets/server_preferences.py @@ -2,13 +2,13 @@ # Copyright 2023 Rafael Mardojai CM # SPDX-License-Identifier: GPL-3.0-or-later -import logging import re import threading from gi.repository import Adw, GLib, Gtk from lfy.api.server import Server +from lfy.api.utils.debug import get_logger # pylint: disable=E1101 @@ -114,6 +114,6 @@ def request_text(self, fun, api_key, entry, spinner): try: valid = fun(api_key) except Exception as exc: # pylint: disable=W0718 - logging.error(exc) + get_logger().error(exc) GLib.idle_add(self.update_ui, valid, entry, spinner)