package logc import ( "basic.com/valib/bhomebus.git" "bytes" "net/url" "encoding/json" "fmt" uuid "github.com/satori/go.uuid" "time" ) const ( LevelFatal = iota + 1 LevelError LevelWarn LevelInfo LevelDebug ) const ( TypeManual = iota + 1 //人工操作日志,系统升级,摄像机修改,算法修改... TypeLoginOut //登录登出日志 TypePollInfo //轮巡摄像机及其对应的算法 TypeStackInfo //数据栈处理情况 TypeWarnInfo //故障信息 TypeRunInfo //运行情况,gpu,mem,cpu TypeSysInfo //系统参数变更,ip,server name,开关机信息 ) type LogInfo struct { ID string `gorm:"column:id;primary_key;unique" json:"id"` Timestamp string `gorm:"column:timestamp" json:"timestamp"` // 2020-12-03 14:39:41 ProcName string `gorm:"column:procName" json:"procName"` ProcID string `gorm:"column:procID" json:"procID"` Level int `gorm:"column:level" json:"level"` // 日志等级 Type int `gorm:"column:type" json:"type"` // 操作类型:人工操作,登录退出,轮循摄像机及对应算法,数据栈处理情况,异常情况等 UserID string `gorm:"column:userID" json:"userID"` // 用户id UserName string `gorm:"column:userName" json:"userName"` // 用户名字 Info string `gorm:"column:info" json:"info"` // 详情 } var ( msgChan chan []byte bhSock *bhomebus.Socket pubFn func(nodes []bhomebus.NetNode, topic string, data []byte, milliseconds int) int ProcName string ProcID string ) func InitBySock(sock *bhomebus.Socket, procId string, procName string) bool { msgChan = make(chan []byte, 100) ProcName = procName ProcID = procId bhSock = sock if bhSock == nil { return false } go saveLoop() return true } func InitByPubFn(fn func(nodes []bhomebus.NetNode, topic string, data []byte, milliseconds int) int, procId string, procName string) bool { msgChan = make(chan []byte, 100) ProcName = procName ProcID = procId pubFn = fn if pubFn == nil { return false } go saveLoop() return true } func Save(level int, logType int, v ...interface{}) { cache(level, logType, "", "", v) } func SaveManual(level int, logType int, userID string, userName string, v ...interface{}) { cache(level, logType, userID, userName, v) } func cache(level int, logType int, userID string, userName string, fmtArgs []interface{}) { // Format with Sprint, Sprintf, or neither. msg := "" if len(fmtArgs) > 0 { msg = fmt.Sprint(fmtArgs...) } fmt.Println(msg) log := LogInfo { ID: uuid.NewV4().String(), Timestamp: time.Now().Format("2006-01-02 15:04:05"), ProcName: ProcName, ProcID: ProcID, Level: level, Type: logType, UserID: userID, UserName: userName, Info: msg, } data,err := json.Marshal(log) if err != nil { fmt.Println("json.Marshal(log) error:", log) return } msgChan <- data } const ( LogSaveTopic = "logSaveTopic" ) func saveLoop() { for { select { case data := <- msgChan: var nodes []bhomebus.NetNode nodes = append(nodes, bhomebus.NetNode{}) if bhSock != nil { bhSock.PubTimeout(nodes, LogSaveTopic, data, 1000) } else if pubFn != nil { pubFn(nodes, LogSaveTopic, data, 1000) } else { fmt.Println("bhSock nil and pubFn nil") } default: time.Sleep(10*time.Millisecond) } } } func Log(userName, method, path, contentType string, body *bytes.Buffer, values url.Values) { }