guanghulab/zhuyuan-agent/log_pusher.py

81 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 日志推送模块 · 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)