zhangzengfei
2023-09-07 55aa27a6ad0e012d62dcea2db37528a1b18836fb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package models
 
import (
    "context"
    "time"
 
    "github.com/satori/go.uuid"
 
    "basic.com/valib/logc.git"
    "basic.com/valib/logger.git"
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)
 
var (
    db             *gorm.DB
    logSetsDb      *gorm.DB
    opChan         chan *OperationLog
    scheduleChan   chan *ScheduleLog
    ruleServerChan chan *logc.RuleServerPushLog
    vaSystemChan   chan *logc.VaSystemLog
)
 
func Init(dbPath, logSetsDbPath string, ctx context.Context) {
    var err error
 
    db, err = gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
 
    if err != nil {
        logger.Debug("db open error ", err)
        return
    }
    _ = db.AutoMigrate(OperationLog{}, ScheduleLog{}, RuleServerLog{}, VaSystemLog{})
 
    opChan = make(chan *OperationLog, 100)
    scheduleChan = make(chan *ScheduleLog, 100)
    ruleServerChan = make(chan *logc.RuleServerPushLog, 100)
    vaSystemChan = make(chan *logc.VaSystemLog, 100)
 
    go saveToDb(ctx)
 
    logSetsDb, err = gorm.Open(sqlite.Open(logSetsDbPath), &gorm.Config{})
    if err != nil {
        logger.Debug("log sets db open error ", err)
        return
    }
 
    _ = logSetsDb.AutoMigrate(Modules{}, Operations{})
    //db.SetLogger(&DbLogger{})
}
 
func saveToDb(ctx context.Context) {
    tc := time.Tick(time.Second * 2)
    var listOp []*OperationLog
    var listSchedule []*ScheduleLog
    var listRuleServer RuleServerLog
    var objVaSystemLog VaSystemLog
 
    maxSize := 50
 
    for {
        select {
        case <-ctx.Done():
            logger.Warn("saveToDb quit")
            return
        case <-tc:
            if len(listOp) > 0 {
                startTime := time.Now()
                db.CreateInBatches(listOp, len(listOp))
                logger.Info("saveToDb save operation log time cost:", time.Since(startTime).Milliseconds(), len(listOp))
                listOp = append([]*OperationLog{})
            }
 
            if len(listSchedule) > 0 {
                startTime := time.Now()
                db.CreateInBatches(listSchedule, len(listSchedule))
                logger.Info("saveToDb save schedule log time cost:", time.Since(startTime).Milliseconds(), len(listSchedule))
                listSchedule = append([]*ScheduleLog{})
            }
        case log := <-opChan:
            listOp = append(listOp, log)
            if len(listOp) >= maxSize {
                startTime := time.Now()
                db.CreateInBatches(listOp, len(listOp))
                logger.Info("saveToDb save operation log time cost:", time.Since(startTime).Milliseconds(), len(listOp))
                listOp = append([]*OperationLog{})
            }
        case log := <-scheduleChan:
            listSchedule = append(listSchedule, log)
            if len(listSchedule) >= maxSize {
                startTime := time.Now()
                db.CreateInBatches(listSchedule, len(listSchedule))
                logger.Info("saveToDb save schedule log time cost:", time.Since(startTime).Milliseconds(), len(listSchedule))
                listSchedule = append([]*ScheduleLog{})
            }
 
        case log := <-ruleServerChan:
            logger.Info("recive ruleserver :", log.ID, log.TaskName, log.Type, log.Info)
            listRuleServer.ID = log.ID
            if logc.UpdateTaskState == log.Type {
                listRuleServer.Name = log.TaskName
                listRuleServer.State = log.Info
                listRuleServer.CreateDate = time.Now().Format("2006-01-02 15:04:05")
                listRuleServer.LastSendDate = time.Now().Format("2006-01-02 15:04:05")
                err := listRuleServer.Insert()
                logger.Info("saveToDb save ruleserver UpdateTaskState:", err)
            } else if logc.IncreaseSuccess == log.Type {
                err := listRuleServer.TotalSuccessIncrement()
                logger.Info("saveToDb save ruleserver IncreaseSuccess:", err)
            } else if logc.IncreaseFailure == log.Type {
                err := listRuleServer.TotalFailureIncrement()
                logger.Info("saveToDb save ruleserver IncreaseFailure:", err)
            } else if logc.UpdateCacheCount == log.Type {
                listRuleServer.TotalCached = log.Info
                err := listRuleServer.TotalCachedSet()
                logger.Info("saveToDb save ruleserver UpdateCacheCount:", err)
            } else if logc.UpdateLastState == log.Type {
                listRuleServer.LastSendState = log.Info
                err := listRuleServer.LastStateSet()
                logger.Info("saveToDb save ruleserver UpdateLastState:", err)
            } else if logc.ReduceFailure == log.Type {
                err := listRuleServer.ReduceFailure()
                logger.Info("saveToDb save ruleserver ReduceFailure:", err)
            }
        case msg := <-vaSystemChan:
            logger.Info("recive vasystem log :", msg.ID, msg.ProcName, msg.Level, msg.Info)
 
            objVaSystemLog.ID = uuid.NewV4().String()
            objVaSystemLog.HostName = msg.HostName
            objVaSystemLog.ProcName = msg.ProcName
            objVaSystemLog.ProcID = msg.ProcID
            objVaSystemLog.Level = msg.Level
            objVaSystemLog.Info = msg.Info
            objVaSystemLog.Timestamp = time.Now().Unix()
            objVaSystemLog.CreateDate = time.Now().Format("2006-01-02 15:04:05")
 
            err := objVaSystemLog.Insert()
            if err != nil {
                logger.Info("saveToDb save vasystem error:", err)
            }
        }
    }
}
 
func GetDB() *gorm.DB {
    return db
}
 
func GetLogSetsDb() *gorm.DB {
    return logSetsDb
}
 
func CloseDB() {
 
}