chenshijun
2021-01-13 d5f4c1b1cedece02a01ffe107229ad924a1c6fb4
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
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
    TypeSysInfo
)
 
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
    ProcName string
    ProcID string
)
 
func Init(sock *bhomebus.Socket, procId string, procName string) {
    msgChan = make(chan []byte, 100)
    ProcName = procName
    ProcID = procId
    bhSock = sock
 
    go saveLoop()
}
 
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{
                Key: 8,
            })
            bhSock.PubTimeout(nodes, LogSaveTopic, data, 1000)
        default:
            time.Sleep(10*time.Millisecond)
        }
    }
}