guanghulab/zhuyuan-agent/log_pusher.py

81 lines
2.6 KiB
Python
Raw Permalink Normal View History

# 日志推送模块 · HTTP POST到主服务器
# HLDP://zhuyuan-agent/log-pusher
import json
import urllib.request
from datetime import datetime
class LogPusher:
"""向主服务器推送操作日志、日记、GPU指标、训练进度"""
def __init__(self, base_url: str, api_key: str, hostname: str = "3090-server"):
self.base_url = base_url.rstrip("/")
self.api_key = api_key
self.hostname = hostname
self._headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
def _post(self, path: str, data: dict, timeout: int = 15) -> bool:
"""POST请求到主服务器"""
url = f"{self.base_url}{path}"
try:
req = urllib.request.Request(
url,
data=json.dumps(data).encode("utf-8"),
headers=self._headers,
method="POST"
)
resp = urllib.request.urlopen(req, timeout=timeout)
result = json.loads(resp.read())
return result.get("ok", False)
except Exception as e:
print(f"[PUSH ERROR] {path}: {e}")
return False
def push_gpu(self, gpu_data: dict) -> bool:
"""推送GPU指标"""
data = {
"hostname": self.hostname,
"gpus": gpu_data.get("gpus", [])
}
return self._post("/api/gpu/status", data)
def push_training(self, training_data: dict) -> bool:
"""推送训练进度"""
return self._post("/api/training/status", training_data)
def push_log(self, level: str, message: str, category: str = "agent") -> bool:
"""推送操作日志"""
return self._post("/api/agent/log", {
"level": level,
"message": message,
"category": category
})
def push_diary(self, entry_type: str, title: str, description: str = "") -> bool:
"""推送日记条目"""
return self._post("/api/agent/diary", {
"type": entry_type,
"title": title,
"description": description
})
def log_info(self, msg: str):
"""快捷info级别日志"""
self.push_log("info", msg)
def log_success(self, msg: str):
"""快捷success级别日志"""
self.push_log("success", msg)
def log_warn(self, msg: str):
"""快捷warn级别日志"""
self.push_log("warn", msg)
def log_error(self, msg: str):
"""快捷error级别日志"""
self.push_log("error", msg)