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() { }