实现节点运行日志上传

This commit is contained in:
刘祥超
2020-10-09 11:06:37 +08:00
parent d5cff7e5f4
commit b8499e42d4
9 changed files with 230 additions and 1 deletions

View File

@@ -389,7 +389,8 @@ func (this *NodeDAO) ComposeNodeConfig(nodeId int64) (*nodeconfigs.NodeConfig, e
} }
config := &nodeconfigs.NodeConfig{ config := &nodeconfigs.NodeConfig{
Id: node.UniqueId, Id: int64(node.Id),
NodeId: node.UniqueId,
IsOn: node.IsOn == 1, IsOn: node.IsOn == 1,
Servers: nil, Servers: nil,
Version: int64(node.Version), Version: int64(node.Version),

View File

@@ -0,0 +1,77 @@
package models
import (
"github.com/TeaOSLab/EdgeAPI/internal/errors"
_ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/dbs"
timeutil "github.com/iwind/TeaGo/utils/time"
"strconv"
"time"
)
type NodeLogDAO dbs.DAO
const ()
func NewNodeLogDAO() *NodeLogDAO {
return dbs.NewDAO(&NodeLogDAO{
DAOObject: dbs.DAOObject{
DB: Tea.Env,
Table: "edgeNodeLogs",
Model: new(NodeLog),
PkName: "id",
},
}).(*NodeLogDAO)
}
var SharedNodeLogDAO = NewNodeLogDAO()
// 创建日志
func (this *NodeLogDAO) CreateLog(nodeRole NodeRole, nodeId int64, level string, tag string, description string, createdAt int64) error {
op := NewNodeLogOperator()
op.Role = nodeRole
op.NodeId = nodeId
op.Level = level
op.Tag = tag
op.Description = description
op.CreatedAt = createdAt
op.Day = timeutil.FormatTime("Ymd", createdAt)
_, err := this.Save(op)
return err
}
// 清除超出一定日期的日志
func (this *NodeLogDAO) DeleteExpiredLogs(days int) error {
if days <= 0 {
return errors.New("invalid days '" + strconv.Itoa(days) + "'")
}
date := time.Now().AddDate(0, 0, -days)
expireDay := timeutil.Format("Ymd", date)
_, err := this.Query().
Where("day<=:day").
Param("day", expireDay).
Delete()
return err
}
// 计算节点数量
func (this *NodeLogDAO) CountNodeLogs(role string, nodeId int64) (int64, error) {
return this.Query().
Attr("nodeId", nodeId).
Attr("role", role).
Count()
}
// 列出单页日志
func (this *NodeLogDAO) ListNodeLogs(role string, nodeId int64, offset int64, size int64) (result []*NodeLog, err error) {
_, err = this.Query().
Attr("nodeId", nodeId).
Attr("role", role).
Offset(offset).
Limit(size).
Slice(&result).
DescPk().
FindAll()
return
}

View File

@@ -0,0 +1,5 @@
package models
import (
_ "github.com/go-sql-driver/mysql"
)

View File

@@ -0,0 +1,28 @@
package models
// 节点日志
type NodeLog struct {
Id uint64 `field:"id"` // ID
Role string `field:"role"` // 节点角色
CreatedAt uint64 `field:"createdAt"` // 创建时间
Tag string `field:"tag"` // 标签
Description string `field:"description"` // 描述
Level string `field:"level"` // 级别
NodeId uint32 `field:"nodeId"` // 节点ID
Day string `field:"day"` // 日期
}
type NodeLogOperator struct {
Id interface{} // ID
Role interface{} // 节点角色
CreatedAt interface{} // 创建时间
Tag interface{} // 标签
Description interface{} // 描述
Level interface{} // 级别
NodeId interface{} // 节点ID
Day interface{} // 日期
}
func NewNodeLogOperator() *NodeLogOperator {
return &NodeLogOperator{}
}

View File

@@ -0,0 +1 @@
package models

View File

@@ -164,6 +164,7 @@ func (this *APINode) listenRPC(listener net.Listener, tlsConfig *tls.Config) err
pb.RegisterHTTPFirewallRuleGroupServiceServer(rpcServer, &services.HTTPFirewallRuleGroupService{}) pb.RegisterHTTPFirewallRuleGroupServiceServer(rpcServer, &services.HTTPFirewallRuleGroupService{})
pb.RegisterHTTPFirewallRuleSetServiceServer(rpcServer, &services.HTTPFirewallRuleSetService{}) pb.RegisterHTTPFirewallRuleSetServiceServer(rpcServer, &services.HTTPFirewallRuleSetService{})
pb.RegisterDBNodeServiceServer(rpcServer, &services.DBNodeService{}) pb.RegisterDBNodeServiceServer(rpcServer, &services.DBNodeService{})
pb.RegisterNodeLogServiceServer(rpcServer, &services.NodeLogService{})
err := rpcServer.Serve(listener) err := rpcServer.Serve(listener)
if err != nil { if err != nil {
return errors.New("[API]start rpc failed: " + err.Error()) return errors.New("[API]start rpc failed: " + err.Error())

View File

@@ -0,0 +1,68 @@
package services
import (
"context"
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
)
// 节点日志相关服务
type NodeLogService struct {
}
// 创建日志
func (this *NodeLogService) CreateNodeLogs(ctx context.Context, req *pb.CreateNodeLogsRequest) (*pb.CreateNodeLogsResponse, error) {
_, _, err := rpcutils.ValidateRequest(ctx)
if err != nil {
return nil, err
}
for _, nodeLog := range req.NodeLogs {
err := models.SharedNodeLogDAO.CreateLog(nodeLog.Role, nodeLog.NodeId, nodeLog.Level, nodeLog.Tag, nodeLog.Description, nodeLog.CreatedAt)
if err != nil {
return nil, err
}
}
return &pb.CreateNodeLogsResponse{}, nil
}
// 查询日志数量
func (this *NodeLogService) CountNodeLogs(ctx context.Context, req *pb.CountNodeLogsRequest) (*pb.CountNodeLogsResponse, error) {
_, _, err := rpcutils.ValidateRequest(ctx)
if err != nil {
return nil, err
}
count, err := models.SharedNodeLogDAO.CountNodeLogs(req.Role, req.NodeId)
if err != nil {
return nil, err
}
return &pb.CountNodeLogsResponse{Count: count}, nil
}
// 列出单页日志
func (this *NodeLogService) ListNodeLogs(ctx context.Context, req *pb.ListNodeLogsRequest) (*pb.ListNodeLogsResponse, error) {
_, _, err := rpcutils.ValidateRequest(ctx)
if err != nil {
return nil, err
}
logs, err := models.SharedNodeLogDAO.ListNodeLogs(req.Role, req.NodeId, req.Offset, req.Size)
if err != nil {
return nil, err
}
result := []*pb.NodeLog{}
for _, log := range logs {
result = append(result, &pb.NodeLog{
Role: log.Role,
Tag: log.Tag,
Description: log.Description,
Level: log.Level,
NodeId: int64(log.NodeId),
CreatedAt: int64(log.CreatedAt),
})
}
return &pb.ListNodeLogsResponse{NodeLogs: result}, nil
}

View File

@@ -0,0 +1,36 @@
package tasks
import (
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
"github.com/iwind/TeaGo/logs"
"time"
)
func init() {
go NewNodeLogCleaner().Start()
}
type NodeLogCleaner struct {
duration time.Duration
}
func NewNodeLogCleaner() *NodeLogCleaner {
return &NodeLogCleaner{
duration: 24 * time.Hour,
}
}
func (this *NodeLogCleaner) Start() {
ticker := time.NewTicker(this.duration)
for range ticker.C {
err := this.loop()
if err != nil {
logs.Println("[TASK]" + err.Error())
}
}
}
func (this *NodeLogCleaner) loop() error {
// TODO 30天这个数值改成可以设置
return models.SharedNodeLogDAO.DeleteExpiredLogs(30)
}

View File

@@ -0,0 +1,12 @@
package tasks
import "testing"
func TestNodeLogCleaner_loop(t *testing.T) {
cleaner := &NodeLogCleaner{}
err := cleaner.loop()
if err != nil {
t.Fatal(err)
}
t.Log("OK")
}