feat: 添加主机 Cron 列表展示功能

This commit is contained in:
2026-04-14 10:34:24 +08:00
parent b44d0cfd00
commit 4dca2dfef4
8 changed files with 87900 additions and 1 deletions

248
app.py
View File

@@ -244,7 +244,7 @@ HTML_TEMPLATE = '''<!DOCTYPE html>
</div>
<!-- 统计卡片 -->
<div class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-8">
<div class="grid grid-cols-2 md:grid-cols-5 gap-4 mb-8">
<div class="card rounded-xl p-4">
<div class="flex items-center justify-between">
<div>
@@ -281,6 +281,34 @@ HTML_TEMPLATE = '''<!DOCTYPE html>
<i class="ri-terminal-box-line text-3xl text-purple-400 opacity-50"></i>
</div>
</div>
<div class="card rounded-xl p-4">
<div class="flex items-center justify-between">
<div>
<p class="text-gray-400 text-sm">系统Cron</p>
<p id="systemCronCount" class="text-2xl font-bold text-orange-400">-</p>
</div>
<i class="ri-timer-line text-3xl text-orange-400 opacity-50"></i>
</div>
</div>
</div>
<!-- 系统 Cron 列表 -->
<div class="card rounded-xl p-6 mb-8">
<div class="flex items-center justify-between mb-4">
<h2 class="text-xl font-bold flex items-center gap-2">
<i class="ri-timer-line text-orange-400"></i>
主机 Cron 列表
</h2>
<button onclick="loadCrons()" class="btn bg-orange-600 hover:bg-orange-700 px-3 py-1 rounded text-sm flex items-center gap-1">
<i class="ri-refresh-line"></i> 刷新
</button>
</div>
<div id="cronsList" class="space-y-3">
<div class="text-center py-8 text-gray-400">
<i class="ri-loader-4-line text-2xl animate-spin"></i>
<p class="mt-2 text-sm">加载中...</p>
</div>
</div>
</div>
<!-- 筛选器 -->
@@ -634,9 +662,84 @@ HTML_TEMPLATE = '''<!DOCTYPE html>
// 初始化
loadProjects();
loadCrons();
// 每30秒自动刷新
setInterval(loadProjects, 30000);
async function loadCrons() {
try {
const res = await fetch('/api/crons');
const data = await res.json();
renderCrons(data.crons);
document.getElementById('systemCronCount').textContent = data.crons.length;
} catch (e) {
console.error('加载Cron失败:', e);
document.getElementById('cronsList').innerHTML = `
<div class="text-center py-8 text-red-400">
<i class="ri-error-warning-line text-2xl"></i>
<p class="mt-2 text-sm">加载失败: ${e.message}</p>
</div>
`;
}
}
function renderCrons(crons) {
const list = document.getElementById('cronsList');
if (crons.length === 0) {
list.innerHTML = `
<div class="text-center py-8 text-gray-400">
<i class="ri-folder-open-line text-2xl"></i>
<p class="mt-2 text-sm">暂无 Cron 任务</p>
</div>
`;
return;
}
const sourceColors = {
'user': { bg: 'bg-blue-500/20', text: 'text-blue-400', label: '用户' },
'system': { bg: 'bg-red-500/20', text: 'text-red-400', label: '系统' },
'cron.d': { bg: 'bg-green-500/20', text: 'text-green-400', label: 'cron.d' }
};
let html = '';
crons.forEach((cron, index) => {
const sourceInfo = sourceColors[cron.source] || { bg: 'bg-gray-500/20', text: 'text-gray-400', label: cron.source };
html += `
<div class="bg-gray-800/50 rounded-lg p-3 border border-gray-700">
<div class="flex items-start justify-between gap-4">
<div class="flex-1">
<div class="flex items-center gap-2 mb-2">
<span class="px-2 py-0.5 rounded text-xs ${sourceInfo.bg} ${sourceInfo.text}">${sourceInfo.label}</span>
${cron.file ? `<span class="text-xs text-gray-500">${cron.file}</span>` : ''}
${cron.user ? `<span class="text-xs text-gray-400">用户: ${cron.user}</span>` : ''}
</div>
<div class="flex items-center gap-3">
<code class="text-yellow-400 text-sm font-mono">${cron.expression}</code>
<span class="text-gray-500 text-xs">→</span>
<span class="text-green-400 text-sm">${cron.description || ''}</span>
</div>
<div class="mt-2 text-gray-300 text-sm font-mono break-all">
${escapeHtml(cron.command)}
</div>
</div>
<div class="text-right">
<span class="text-xs text-gray-500">#${index + 1}</span>
</div>
</div>
</div>
`;
});
list.innerHTML = html;
}
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
</script>
</body>
</html>
@@ -821,6 +924,149 @@ def api_delete_project(project_id):
return jsonify({'message': '删除成功'})
def get_system_crons():
"""获取系统所有 cron 任务"""
crons = []
# 获取当前用户的 crontab
try:
result = subprocess.run(
"crontab -l 2>/dev/null",
shell=True, capture_output=True, text=True, timeout=5
)
user_crontab = result.stdout.strip()
if user_crontab:
for line in user_crontab.split('\n'):
line = line.strip()
if line and not line.startswith('#'):
# 解析 cron 行
parts = line.split()
if len(parts) >= 6:
cron_expr = ' '.join(parts[:5])
command = ' '.join(parts[5:])
crons.append({
'source': 'user',
'expression': cron_expr,
'command': command,
'line': line
})
except:
pass
# 获取系统级 cron (/etc/crontab)
try:
if os.path.exists('/etc/crontab'):
with open('/etc/crontab', 'r') as f:
for line in f:
line = line.strip()
if line and not line.startswith('#'):
parts = line.split()
if len(parts) >= 7:
# 系统 crontab 有额外的 user 字段
cron_expr = ' '.join(parts[:5])
user = parts[5]
command = ' '.join(parts[6:])
crons.append({
'source': 'system',
'expression': cron_expr,
'user': user,
'command': command,
'line': line
})
except:
pass
# 获取 /etc/cron.d/ 目录下的任务
try:
cron_d_dir = '/etc/cron.d'
if os.path.exists(cron_d_dir):
for filename in os.listdir(cron_d_dir):
filepath = os.path.join(cron_d_dir, filename)
if os.path.isfile(filepath):
with open(filepath, 'r') as f:
for line in f:
line = line.strip()
if line and not line.startswith('#'):
parts = line.split()
if len(parts) >= 7:
cron_expr = ' '.join(parts[:5])
user = parts[5]
command = ' '.join(parts[6:])
crons.append({
'source': 'cron.d',
'file': filename,
'expression': cron_expr,
'user': user,
'command': command,
'line': line
})
except:
pass
return crons
def parse_cron_expression(expr):
"""解析 cron 表达式为人类可读格式"""
parts = expr.split()
if len(parts) != 5:
return expr
minute, hour, day, month, weekday = parts
desc = []
# 分钟
if minute == '*':
desc.append('每分钟')
elif minute.startswith('*/'):
desc.append(f'{minute[2:]}分钟')
else:
desc.append(f'{minute}')
# 小时
if hour != '*':
if minute == '*':
desc = [f'{hour}点每分钟']
else:
desc = [f'{hour}{minute}']
elif minute.startswith('*/'):
# 保持 "每X分钟"
pass
# 日期
if day != '*':
desc.append(f'{day}')
# 月份
if month != '*':
months = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
try:
desc.append(f'{months[int(month)-1]}')
except:
desc.append(f'{month}')
# 星期
if weekday != '*':
weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
try:
# 0=周日, 1=周一...
desc.append(weekdays[int(weekday)])
except:
desc.append(f'{weekday}')
return ' '.join(desc) if desc else expr
@app.route('/api/crons')
def api_crons():
"""获取系统 cron 列表"""
crons = get_system_crons()
for cron in crons:
cron['description'] = parse_cron_expression(cron['expression'])
return jsonify({'crons': crons})
if __name__ == '__main__':
os.makedirs(os.path.join(BASE_DIR, 'logs'), exist_ok=True)
print("=" * 50)

242
logs/ai-chat-system.log Normal file
View File

@@ -0,0 +1,242 @@
==================================================
[2026-04-11T20:39:35.611218] start
Command: python3 main.py
Directory: /home/xian/.openclaw/workspace-coder/works/ai-chat
/home/xian/.openclaw/workspace-coder/works/ai-chat/main.py:481: DeprecationWarning:
on_event is deprecated, use lifespan event handlers instead.
Read more about it in the
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
@app.on_event("startup")
/home/xian/.openclaw/workspace-coder/works/ai-chat/main.py:506: DeprecationWarning:
on_event is deprecated, use lifespan event handlers instead.
Read more about it in the
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
@app.on_event("shutdown")
INFO: Started server process [1469228]
INFO: Waiting for application startup.
INFO:__main__:数据库初始化完成
INFO:services.ai_service:AI配置已更新: api_base=http://192.168.2.17:19007/v1, model=auto, use_mock=False
INFO:__main__:AI配置已加载: http://192.168.2.17:19007/v1, model=auto
INFO:services.matrix_service:Matrix配置: homeserver=http://matrix.tphai.com, user=@tester:matrix.tphai.com
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/account/whoami "HTTP/1.1 200 OK"
INFO:services.matrix_service:Matrix HTTP API连接成功: @tester:matrix.tphai.com
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/joined_rooms "HTTP/1.1 200 OK"
INFO:services.matrix_service:Matrix房间: !CUXwXrsopvYKCAEdKe:matrix.tphai.com
INFO:__main__:Matrix Bot已启动
INFO:services.matrix_service:Matrix HTTP同步任务已启动
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:19020 (Press CTRL+C to quit)
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000 "HTTP/1.1 200 OK"
INFO: 127.0.0.1:48668 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6449_126845_4290_2988_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6449_126845_4290_2988_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61860 - "GET / HTTP/1.1" 200 OK
INFO: 192.168.2.10:61860 - "GET /api/conversations HTTP/1.1" 200 OK
INFO: 192.168.2.10:61862 - "WebSocket /ws/main_user" [accepted]
INFO:__main__:WebSocket连接: main_user, 当前连接数: 1
INFO: 192.168.2.10:61861 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: connection open
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 127.0.0.1:37244 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6449_126845_4290_2988_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: PUT http://matrix.tphai.com/_matrix/client/v3/rooms/!CUXwXrsopvYKCAEdKe:matrix.tphai.com/send/m.room.message/m1248774373 "HTTP/1.1 200 OK"
INFO:services.matrix_service:Matrix消息发送成功: !CUXwXrsopvYKCAEdKe:matrix.tphai.com
INFO:services.ai_service:调用AI API: http://192.168.2.17:19007/v1/chat/completions, model=auto
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6449_126845_4290_2989_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: POST http://192.168.2.17:19007/v1/chat/completions "HTTP/1.1 502 Bad Gateway"
ERROR:services.ai_service:AI API调用失败: Server error '502 Bad Gateway' for url 'http://192.168.2.17:19007/v1/chat/completions'
For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/502
INFO:httpx:HTTP Request: PUT http://matrix.tphai.com/_matrix/client/v3/rooms/!CUXwXrsopvYKCAEdKe:matrix.tphai.com/send/m.room.message/m1248775047 "HTTP/1.1 200 OK"
INFO:services.matrix_service:Matrix消息发送成功: !CUXwXrsopvYKCAEdKe:matrix.tphai.com
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6450_126845_4290_2989_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6451_126845_4290_2989_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 127.0.0.1:33214 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6451_126845_4290_2989_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61861 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: PUT http://matrix.tphai.com/_matrix/client/v3/rooms/!CUXwXrsopvYKCAEdKe:matrix.tphai.com/send/m.room.message/m1248795620 "HTTP/1.1 200 OK"
INFO:services.matrix_service:Matrix消息发送成功: !CUXwXrsopvYKCAEdKe:matrix.tphai.com
INFO:services.ai_service:调用AI API: http://192.168.2.17:19007/v1/chat/completions, model=auto
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6451_126851_4290_2989_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 127.0.0.1:36850 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6452_126851_4290_2989_3381_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: POST http://192.168.2.17:19007/v1/chat/completions "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: PUT http://matrix.tphai.com/_matrix/client/v3/rooms/!CUXwXrsopvYKCAEdKe:matrix.tphai.com/send/m.room.message/m1248804105 "HTTP/1.1 200 OK"
INFO:services.matrix_service:Matrix消息发送成功: !CUXwXrsopvYKCAEdKe:matrix.tphai.com
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6452_126851_4290_2990_3382_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6453_126851_4290_2990_3382_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6453_126851_4290_2991_3383_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6453_126851_4291_2991_3383_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6453_126851_4293_2991_3383_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6453_126851_4294_2991_3383_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126851_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 127.0.0.1:35322 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126851_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126851_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126851_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126851_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126851_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 127.0.0.1:44872 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 127.0.0.1:60958 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2991_3384_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2992_3385_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61890 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126857_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 127.0.0.1:52004 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61946 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 127.0.0.1:51416 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:61981 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:61982 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126863_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3386_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 127.0.0.1:41872 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:62002 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO: 192.168.2.10:62001 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126869_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126875_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126875_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6454_126875_4294_2992_3387_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6455_126875_4295_2993_3388_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 127.0.0.1:38462 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6455_126875_4295_2993_3389_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 127.0.0.1:38470 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6459_126875_4295_2993_3389_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6459_126875_4295_2993_3389_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:62044 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:62045 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6463_126875_4295_2993_3389_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6464_126875_4295_2994_3390_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6467_126881_4295_2994_3390_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6468_126881_4295_2994_3390_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6472_126881_4295_2994_3390_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6474_126881_4295_2996_3391_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6474_126881_4295_2997_3391_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 127.0.0.1:53056 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6476_126881_4295_2999_3391_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6476_126881_4295_2999_3391_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 192.168.2.10:62071 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: 192.168.2.10:62072 - "GET /api/conversations/latest HTTP/1.1" 200 OK
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6478_126881_4295_3000_3392_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6478_126881_4295_3001_3393_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6481_126887_4295_3002_3395_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6482_126887_4295_3002_3396_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6484_126887_4295_3003_3396_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6487_126887_4295_3006_3396_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET http://matrix.tphai.com/_matrix/client/v3/sync?timeout=5000&since=s6488_126887_4295_3006_3396_3_530_126_0_1_1_1 "HTTP/1.1 200 OK"
INFO: 127.0.0.1:60854 - "GET /api/admin/stats HTTP/1.1" 200 OK
INFO: Shutting down
INFO:__main__:WebSocket断开: main_user
INFO: connection closed
INFO: Waiting for application shutdown.
INFO:__main__:应用已关闭
INFO: Application shutdown complete.
INFO: Finished server process [1469228]
Terminated

262
logs/app.log Normal file
View File

@@ -0,0 +1,262 @@
==================================================
项目服务管理面板
访问地址: http://localhost:19013
==================================================
* Serving Flask app 'app'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:19013
* Running on http://192.168.2.17:19013
Press CTRL+C to quit
192.168.2.10 - - [12/Apr/2026 18:59:10] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 18:59:12] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 18:59:16] "POST /api/projects/llm-proxy/start HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 18:59:21] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 18:59:24] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 18:59:25] "GET /api/projects HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 18:59:28] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [12/Apr/2026 18:59:31] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 18:59:55] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:00:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:00:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:01:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:01:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:02:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:02:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:03:57] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:04:58] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:05:59] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:07:00] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:08:01] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:09:02] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:10:03] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:11:04] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:12:05] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:13:06] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:14:07] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:15:08] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:16:09] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:17:10] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:18:11] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:19:12] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:20:13] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:21:14] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:22:15] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:23:16] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:24:17] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:25:18] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:26:19] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:27:20] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:28:21] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:29:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:30:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:31:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:32:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:33:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:34:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:35:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:36:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:37:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:38:23] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:39:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:40:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:41:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:42:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:43:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:44:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:45:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:46:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:47:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:48:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:49:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:50:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:51:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:52:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:53:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:54:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:55:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:56:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:57:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:58:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 19:59:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:00:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:01:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:02:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:03:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:04:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:05:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:06:22] "GET /api/projects HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 20:06:30] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:10:49] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:10:55] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:11:25] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:11:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:12:25] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:12:55] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:13:25] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:13:55] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:14:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:14:52] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:14:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:15:25] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:15:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:16:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:17:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:18:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:19:22] "GET /api/projects HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 20:20:02] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:20:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:21:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:22:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:23:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:24:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:25:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:26:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:27:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:28:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:29:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:30:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:31:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:32:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:33:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:34:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:35:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:36:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:37:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:38:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:39:22] "GET /api/projects HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 20:40:01] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:40:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:41:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:42:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:43:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:44:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:45:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:46:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:47:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:48:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:49:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:50:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:51:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:52:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:53:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:54:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:55:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:56:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:57:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:58:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 20:59:22] "GET /api/projects HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 21:00:01] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:00:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:01:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:02:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:03:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:04:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:05:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:06:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:07:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:08:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:09:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:10:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:11:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:12:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:13:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:14:22] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [12/Apr/2026 21:15:22] "GET /api/projects HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 21:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 21:40:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 22:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 22:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 22:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 23:00:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 23:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2026 23:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 00:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 00:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 00:40:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 01:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 01:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 01:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 02:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 02:20:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 02:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 03:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 03:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 03:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 04:00:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 04:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 04:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 05:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 05:20:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 05:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 06:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 06:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 06:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 07:00:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 07:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 07:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 08:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 08:20:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 08:40:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 09:00:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 09:20:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 09:40:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 10:00:01] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:08:02] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:08:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:08:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:09:58] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:10:59] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:11:59] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:13:00] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:14:01] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:15:03] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:16:03] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:17:05] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:18:05] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:19:06] "GET /api/projects HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 10:20:01] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:20:08] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:21:09] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:22:10] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:23:10] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:23:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:23:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:24:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:24:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:25:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:25:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:26:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:26:56] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:27:27] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:27:37] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:27:42] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:28:13] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:28:43] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:29:11] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:29:43] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:30:13] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:30:43] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:31:13] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:32:04] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:32:05] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:32:09] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:32:16] "POST /api/projects/xian-favor/start HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:32:26] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:32:41] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:33:06] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:33:11] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:33:12] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:33:43] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:34:13] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:34:43] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:35:13] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:35:43] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:13] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:43] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:43] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:49] "GET /api/projects HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:37:19] "GET /api/projects HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 10:37:30] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:37:47] "GET /api/projects HTTP/1.1" 200 -

File diff suppressed because it is too large Load Diff

1587
logs/project-panel.log Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1550
logs/tech-forum.log Normal file

File diff suppressed because it is too large Load Diff

39
logs/xian-favor.log Normal file
View File

@@ -0,0 +1,39 @@
==================================================
[2026-04-13T10:32:16.459402] start
Command: xian_favor serve --port 19014
Directory: /home/xian/.openclaw/workspace-coder/works/xian-favor
🚀 启动API服务: http://0.0.0.0:19014
* Serving Flask app 'xian_favor.api'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:19014
* Running on http://192.168.2.17:19014
Press CTRL+C to quit
192.168.2.10 - - [13/Apr/2026 10:32:21] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:32:21] "GET /api/items?limit=100 HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:32:21] "GET /api/stats HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 10:32:26] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:32:41] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:33:11] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:33:12] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:33:43] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:34:13] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:34:43] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:35:13] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:35:43] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:36:13] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:36:43] "GET /api/health HTTP/1.1" 404 -
192.168.2.10 - - [13/Apr/2026 10:36:45] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:45] "GET /api/items?limit=100 HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:45] "GET /api/stats HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:49] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:49] "GET /api/items?limit=100 HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:36:49] "GET /api/stats HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 10:36:49] "GET /api/health HTTP/1.1" 404 -
192.168.2.10 - - [13/Apr/2026 10:37:02] "GET / HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:37:02] "GET /api/items?limit=100 HTTP/1.1" 200 -
192.168.2.10 - - [13/Apr/2026 10:37:02] "GET /api/stats HTTP/1.1" 200 -
127.0.0.1 - - [13/Apr/2026 10:37:19] "GET /api/health HTTP/1.1" 404 -
127.0.0.1 - - [13/Apr/2026 10:37:30] "GET / HTTP/1.1" 200 -