mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-18 11:44:18 +00:00
perf: 优化日志增量获取逻辑
This commit is contained in:
@@ -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()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -5,7 +5,7 @@ import asyncio
|
|||||||
import quart
|
import quart
|
||||||
|
|
||||||
from ....core import app
|
from ....core import app
|
||||||
from .groups import log
|
from .groups import logs
|
||||||
from . import group
|
from . import group
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+26
-11
@@ -7,12 +7,16 @@ LOG_PAGE_SIZE = 20
|
|||||||
MAX_CACHED_PAGES = 10
|
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:
|
def add_log(self, log: str) -> bool:
|
||||||
"""添加日志
|
"""添加日志
|
||||||
@@ -20,9 +24,8 @@ class LogPage(pydantic.BaseModel):
|
|||||||
Returns:
|
Returns:
|
||||||
bool: 是否已满
|
bool: 是否已满
|
||||||
"""
|
"""
|
||||||
self.logs += log
|
self.logs.append(log)
|
||||||
self.cached_count += 1
|
return len(self.logs) >= LOG_PAGE_SIZE
|
||||||
return self.cached_count >= LOG_PAGE_SIZE
|
|
||||||
|
|
||||||
|
|
||||||
class LogCache:
|
class LogCache:
|
||||||
@@ -34,16 +37,28 @@ class LogCache:
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.log_pages = []
|
self.log_pages = []
|
||||||
self.log_pages.append(LogPage())
|
self.log_pages.append(LogPage(number=0))
|
||||||
|
|
||||||
def add_log(self, log: str):
|
def add_log(self, log: str):
|
||||||
"""添加日志"""
|
"""添加日志"""
|
||||||
if self.log_pages[-1].add_log(log):
|
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:
|
if len(self.log_pages) > MAX_CACHED_PAGES:
|
||||||
self.log_pages.pop(0)
|
self.log_pages.pop(0)
|
||||||
|
|
||||||
def get_all_logs(self) -> str:
|
def get_log_by_pointer(
|
||||||
"""获取所有日志"""
|
self,
|
||||||
return "".join([page.logs for page in self.log_pages])
|
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user