/* *中台api mongodb 保存请求日志 * */ package common import ( "app.yhyue.com/moapp/jybase/mongodb" "fmt" "io/ioutil" "log" "net/http" "regexp" "sync" "time" ) var ( arr = map[string][]map[string]interface{}{} //对map的同步 saveLogsLock = &sync.Mutex{} saveCount = map[string]int{} initCount = 500 ) //添加日志 func AddMgoLogs(mgoLog mongodb.MongodbSim, r *http.Request, tableName string, ExcludeUrl []*regexp.Regexp, c int) { for _, v := range ExcludeUrl { // 过滤无意义路由日志 if v.MatchString(r.URL.Path) { return } } if saveCount[tableName] == 0 { c = If(c > 0, c, initCount).(int) saveCount[tableName] = c go SaveLogTask(mgoLog, tableName) } timeNow := time.Now() agent := r.Header.Get("user-agent") ref := r.Referer() s_url := r.RequestURI md, _ := ioutil.ReadAll(r.Body) //md, _ := json.Marshal(r.Form) str := string(md) logs := map[string]interface{}{ "date": timeNow.Unix(), "ip": GetIp(r), "refer": ref, "year": timeNow.Year(), "month": timeNow.Month(), "day": timeNow.Day(), "hour": timeNow.Hour(), "minutes": timeNow.Minute(), "mdescribe": str, "client": agent, "os": GetOS(agent), "browse": GetBrowse(agent), "method": r.Method, "url": s_url, "userid": r.Header.Get("userId"), } saveLogsLock.Lock() arr[tableName] = append(arr[tableName], logs) if len(arr[tableName]) >= saveCount[tableName] { tmp := arr[tableName] arr[tableName] = make([]map[string]interface{}, 0) go func(tableName string, tmp []map[string]interface{}) { log.Println(fmt.Sprintf("%s save..visit..log %d", tableName, len(tmp))) mgoLog.SaveBulk(tableName, tmp...) }(tableName, tmp) } saveLogsLock.Unlock() } //定时保存 //定时保存日志 func SaveLogTask(mgoLog mongodb.MongodbSim, tableName string) { CrontabByTicker(false, 5, func() { lock.Lock() if len(arr[tableName]) >= 1 { tmp := arr[tableName] arr[tableName] = make([]map[string]interface{}, 0) go func() { log.Println(fmt.Sprintf("ticker: %s save..visit..log %d", tableName, len(tmp))) mgoLog.SaveBulk(tableName, tmp...) }() } lock.Unlock() }) } //定时任务 func CrontabByTicker(flag bool, c int, f func()) { if c == 0 { log.Println("定时任务参数有误:", c) return } //默认5分钟 countdown := 5 * 60 if c > 0 { countdown = c * 60 } if flag { go f() } ticker := time.NewTicker(time.Duration(countdown) * time.Second) go func(t *time.Ticker) { for { select { case <-t.C: go f() } } }(ticker) }