From 9703fc0366ac6ef99378b5ce6ed336cefccb3f08 Mon Sep 17 00:00:00 2001 From: RockChinQ <1010553892@qq.com> Date: Sun, 13 Oct 2024 22:33:51 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=A2=9E=E9=87=8F=E8=8E=B7=E5=8F=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/api/http/controller/groups/log.py | 21 --------------- pkg/api/http/controller/groups/logs.py | 32 ++++++++++++++++++++++ pkg/api/http/controller/main.py | 2 +- pkg/utils/logcache.py | 37 ++++++++++++++++++-------- 4 files changed, 59 insertions(+), 33 deletions(-) delete mode 100644 pkg/api/http/controller/groups/log.py create mode 100644 pkg/api/http/controller/groups/logs.py diff --git a/pkg/api/http/controller/groups/log.py b/pkg/api/http/controller/groups/log.py deleted file mode 100644 index fe6de631..00000000 --- a/pkg/api/http/controller/groups/log.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import annotations - -import traceback - -import quart - -from .....core import app -from .. import group - - -@group.group_class('log', '/api/v1/log') -class LogRouterGroup(group.RouterGroup): - - async def initialize(self) -> None: - @self.route('', methods=['GET']) - async def _() -> str: - return self.success( - data={ - "logs": self.ap.log_cache.get_all_logs() - } - ) diff --git a/pkg/api/http/controller/groups/logs.py b/pkg/api/http/controller/groups/logs.py new file mode 100644 index 00000000..36aa0d75 --- /dev/null +++ b/pkg/api/http/controller/groups/logs.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +import traceback + +import quart + +from .....core import app +from .. import group + + +@group.group_class('logs', '/api/v1/logs') +class LogsRouterGroup(group.RouterGroup): + + async def initialize(self) -> None: + @self.route('', methods=['GET']) + async def _() -> str: + + start_page_number = int(quart.request.args.get('start_page_number', 0)) + start_offset = int(quart.request.args.get('start_offset', 0)) + + logs_str, end_page_number, end_offset = self.ap.log_cache.get_log_by_pointer( + start_page_number=start_page_number, + start_offset=start_offset + ) + + return self.success( + data={ + "logs": logs_str, + "end_page_number": end_page_number, + "end_offset": end_offset + } + ) diff --git a/pkg/api/http/controller/main.py b/pkg/api/http/controller/main.py index 83e86696..6c7c72f2 100644 --- a/pkg/api/http/controller/main.py +++ b/pkg/api/http/controller/main.py @@ -5,7 +5,7 @@ import asyncio import quart from ....core import app -from .groups import log +from .groups import logs from . import group diff --git a/pkg/utils/logcache.py b/pkg/utils/logcache.py index 0fe419f1..2b8151c2 100644 --- a/pkg/utils/logcache.py +++ b/pkg/utils/logcache.py @@ -7,12 +7,16 @@ LOG_PAGE_SIZE = 20 MAX_CACHED_PAGES = 10 -class LogPage(pydantic.BaseModel): +class LogPage(): """日志页""" + number: int + """页码""" - cached_count: int = 0 + logs: list[str] - logs: str = "" + def __init__(self, number: int): + self.number = number + self.logs = [] def add_log(self, log: str) -> bool: """添加日志 @@ -20,9 +24,8 @@ class LogPage(pydantic.BaseModel): Returns: bool: 是否已满 """ - self.logs += log - self.cached_count += 1 - return self.cached_count >= LOG_PAGE_SIZE + self.logs.append(log) + return len(self.logs) >= LOG_PAGE_SIZE class LogCache: @@ -34,16 +37,28 @@ class LogCache: def __init__(self): self.log_pages = [] - self.log_pages.append(LogPage()) + self.log_pages.append(LogPage(number=0)) def add_log(self, log: str): """添加日志""" if self.log_pages[-1].add_log(log): - self.log_pages.append(LogPage()) + self.log_pages.append(LogPage(number=self.log_pages[-1].number + 1)) if len(self.log_pages) > MAX_CACHED_PAGES: self.log_pages.pop(0) - def get_all_logs(self) -> str: - """获取所有日志""" - return "".join([page.logs for page in self.log_pages]) + def get_log_by_pointer( + self, + start_page_number: int, + start_offset: int, + ) -> tuple[str, int, int]: + """获取指定页码和偏移量的日志""" + final_logs_str = "" + + for page in self.log_pages: + if page.number == start_page_number: + final_logs_str += "\n".join(page.logs[start_offset:]) + elif page.number > start_page_number: + final_logs_str += "\n".join(page.logs) + + return final_logs_str, page.number, len(page.logs)