package logc
|
|
import (
|
"basic.com/valib/bhomebus.git"
|
|
"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)
|
}
|
}
|
}
|