Skip to content

Commit 696cd97

Browse files
committed
feat(日志): 增加后端日志级别过滤功能并优化前端显示
1. 在后端添加日志级别过滤参数,支持按级别筛选日志 2. 前端移除本地级别过滤,改为向后端传递过滤参数 3. 优化日志显示样式和自动刷新逻辑
1 parent ccf6dda commit 696cd97

File tree

3 files changed

+46
-15
lines changed

3 files changed

+46
-15
lines changed

server/routers/system_router.py

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,42 @@ async def update_config_batch(items: dict = Body(...), current_user: User = Depe
5252

5353

5454
@system.get("/logs")
55-
async def get_system_logs(current_user: User = Depends(get_admin_user)):
56-
"""获取系统日志"""
55+
async def get_system_logs(
56+
levels: str | None = None,
57+
current_user: User = Depends(get_admin_user)
58+
):
59+
"""获取系统日志
60+
61+
Args:
62+
levels: 可选的日志级别过滤,多个级别用逗号分隔,如 "INFO,ERROR,DEBUG,WARNING"
63+
"""
5764
try:
5865
from src.utils.logging_config import LOG_FILE
5966

67+
# 解析日志级别过滤条件
68+
level_filter = None
69+
if levels:
70+
level_filter = set(level.strip().upper() for level in levels.split(',') if level.strip())
71+
6072
async with aiofiles.open(LOG_FILE) as f:
6173
# 读取最后1000行
6274
lines = []
6375
async for line in f:
64-
lines.append(line)
65-
if len(lines) > 1000:
66-
lines.pop(0)
76+
filtered_line = line.rstrip('\n\r')
77+
# 如果指定了日志级别过滤,则按级别过滤
78+
if level_filter:
79+
# 日志格式: 2025-03-10 08:26:37,269 - INFO - module - message
80+
# 提取日志级别
81+
parts = filtered_line.split(' - ')
82+
if len(parts) >= 2 and parts[1].strip() in level_filter:
83+
lines.append(filtered_line + '\n')
84+
# 继续读取以保持行数统计准确
85+
if len(lines) > 1000:
86+
lines.pop(0)
87+
else:
88+
lines.append(filtered_line + '\n')
89+
if len(lines) > 1000:
90+
lines.pop(0)
6791

6892
log = "".join(lines)
6993
return {"log": log, "message": "success", "log_file": LOG_FILE}

web/src/apis/system_api.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,13 @@ export const configApi = {
5454

5555
/**
5656
* 获取系统日志
57+
* @param {string} levels - 可选的日志级别过滤,多个级别用逗号分隔
5758
* @returns {Promise} - 系统日志
5859
*/
59-
getLogs: async () => apiAdminGet('/api/system/logs')
60+
getLogs: async (levels) => {
61+
const url = levels ? `/api/system/logs?levels=${encodeURIComponent(levels)}` : '/api/system/logs';
62+
return apiAdminGet(url);
63+
}
6064
}
6165

6266
// =============================================================================

web/src/components/DebugComponent.vue

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,6 @@ const processedLogs = computed(() => {
196196
return state.rawLogs
197197
.map(parseLogLine)
198198
.filter(log => log !== null)
199-
.filter(log => state.selectedLevels.includes(log.level))
200199
.filter(log => {
201200
if (!state.searchText) return true;
202201
return log.raw.toLowerCase().includes(state.searchText.toLowerCase());
@@ -210,7 +209,9 @@ const fetchLogs = async () => {
210209
state.fetching = true;
211210
try {
212211
error.value = '';
213-
const logData = await configApi.getLogs();
212+
// 将选中的日志级别转换为逗号分隔的字符串传递给后端
213+
const levelsParam = state.selectedLevels.join(',');
214+
const logData = await configApi.getLogs(levelsParam);
214215
state.rawLogs = logData.log.split('\n').filter(line => line.trim());
215216
216217
await nextTick();
@@ -248,12 +249,18 @@ const toggleLogLevel = (level) => {
248249
const index = currentLevels.indexOf(level);
249250
250251
if (index > -1) {
252+
// 如果取消选中后没有选中的级别,默认全选
253+
if (currentLevels.length === 1) {
254+
return;
255+
}
251256
currentLevels.splice(index, 1);
252257
} else {
253258
currentLevels.push(level);
254259
}
255260
256261
state.selectedLevels = currentLevels;
262+
// 切换日志级别后重新获取数据
263+
fetchLogs();
257264
};
258265
259266
// 自动刷新
@@ -470,10 +477,6 @@ const printAgentConfig = async () => {
470477
</script>
471478

472479
<style scoped>
473-
.log-viewer {
474-
background: var(--gray-0);
475-
}
476-
477480
.log-viewer.fullscreen {
478481
padding: 16px;
479482
}
@@ -555,11 +558,11 @@ const printAgentConfig = async () => {
555558
.log-container {
556559
height: calc(80vh - 200px);
557560
overflow-y: auto;
558-
background: var(--gray-900);
559-
color: var(--gray-0);
561+
background: var(--gray-0);
562+
color: var(--gray-1000);
560563
border-radius: 5px;
561564
font-family: 'Consolas', 'Monaco', monospace;
562-
font-size: 13px;
565+
font-size: 12px;
563566
}
564567
565568
.log-lines {

0 commit comments

Comments
 (0)