| | |
| | | package logc |
| | | |
| | | import ( |
| | | "basic.com/valib/bhomebus.git" |
| | | "encoding/json" |
| | | "basic.com/valib/bhshmq.git/proto/source/bhome_msg" |
| | | "fmt" |
| | | uuid "github.com/satori/go.uuid" |
| | | "sync" |
| | | "time" |
| | | ) |
| | |
| | | TypeSysInfo //系统参数变更,ip,server name,开关机信息 |
| | | ) |
| | | |
| | | type LogPrinter interface { |
| | | Marshal() ([]byte, error) |
| | | Topic() string |
| | | } |
| | | |
| | | |
| | | 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 |
| | |
| | | } |
| | | |
| | | type LogRegister struct { |
| | | Nodes []bhomebus.NetNode |
| | | Nodes []bhome_msg.BHAddress |
| | | Topic string |
| | | Payload []byte |
| | | } |
| | |
| | | type LogReportCallback func(*LogRegister) |
| | | |
| | | var ( |
| | | msgChan chan []byte |
| | | //bhSock *bhomebus.Socket |
| | | //pubFn func(nodes []bhomebus.NetNode, topic string, data []byte, milliseconds int) int |
| | | logCh chan LogPrinter |
| | | logger *Log |
| | | ProcName string |
| | | ProcID string |
| | | |
| | | ) |
| | | |
| | | func Init(flogWriter LogReportCallback, log *Log, procId string, procName string, wg *sync.WaitGroup, done chan struct{}) bool { |
| | | logCh = make(chan LogPrinter, 300) |
| | | |
| | | func Init(flogWriter LogReportCallback, procId string, procName string, wg *sync.WaitGroup, done chan struct{}) bool { |
| | | msgChan = make(chan []byte, 100) |
| | | if nil != log { |
| | | logger = log |
| | | } else { |
| | | logger = &Log{} |
| | | } |
| | | |
| | | ProcName = procName |
| | | ProcID = procId |
| | | |
| | |
| | | return true |
| | | } |
| | | |
| | | //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) |
| | | func SaveOperationLog(log *OperationLog, timeout time.Duration) { |
| | | if nil == log { |
| | | return |
| | | } |
| | | |
| | | msgChan <- data |
| | | log.ProcName = ProcName |
| | | log.ProcID = ProcID |
| | | |
| | | deliverLog(log, timeout) |
| | | } |
| | | |
| | | func SaveScheduleLog(category, level int, timeout time.Duration, v ...interface{}) { |
| | | msg := "" |
| | | if len(v) > 0 { |
| | | msg = fmt.Sprint(v...) |
| | | } |
| | | |
| | | if msg == "" { |
| | | return |
| | | } |
| | | |
| | | log := &ScheduleLog{ |
| | | Timestamp: time.Now().Unix(), |
| | | ProcName: ProcName, |
| | | ProcID: ProcID, |
| | | Level: level, |
| | | Type: category, |
| | | Info: msg, |
| | | } |
| | | |
| | | deliverLog(log, timeout) |
| | | } |
| | | |
| | | func SaveRuleServerLog(ruleServerPushLog RuleServerPushLog, timeout time.Duration) { |
| | | deliverLog(&ruleServerPushLog, timeout) |
| | | } |
| | | |
| | | func deliverLog(l LogPrinter, timeout time.Duration) { |
| | | select { |
| | | case logCh <- l: |
| | | return |
| | | case <-time.After(timeout): |
| | | var info string |
| | | b, err := l.Marshal() |
| | | if nil == err { |
| | | info = string(b) |
| | | } |
| | | logger.Fatal("SaveScheduleLog failed to save log", info, l.Topic()) |
| | | } |
| | | } |
| | | |
| | | //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" |
| | | OperationLogTopic = "operationLogSaveTopic" |
| | | ScheduleLogTopic = "scheduleLogSaveTopic" |
| | | RuleServerLogTopic = "ruleServerLogSaveTopic" |
| | | ) |
| | | |
| | | func saveLoop(logCallback LogReportCallback, wg *sync.WaitGroup, done chan struct{}) { |
| | |
| | | select { |
| | | case <- done: |
| | | return |
| | | case data := <- msgChan: |
| | | var nodes []bhomebus.NetNode |
| | | nodes = append(nodes, bhomebus.NetNode{}) |
| | | case log := <- logCh: |
| | | payload, err := log.Marshal() |
| | | if err != nil { |
| | | logger.Error("failed to Marshal", log) |
| | | } else { |
| | | var nodes []bhome_msg.BHAddress |
| | | nodes = append(nodes, bhome_msg.BHAddress{}) |
| | | |
| | | reg := &LogRegister { |
| | | nodes, |
| | | LogSaveTopic, |
| | | data, |
| | | reg := &LogRegister { |
| | | nodes, |
| | | log.Topic(), |
| | | payload, |
| | | } |
| | | |
| | | logCallback(reg) |
| | | } |
| | | |
| | | logCallback(reg) |
| | | |
| | | default: |
| | | time.Sleep(10*time.Millisecond) |
| | | } |
| | | } |
| | | } |