wangshan преди 3 години
родител
ревизия
3116753a8f
променени са 1 файла, в които са добавени 54 реда и са изтрити 4 реда
  1. 54 4
      common/mgosl.go

+ 54 - 4
common/mgosl.go

@@ -6,6 +6,7 @@ package common
 
 import (
 	"app.yhyue.com/moapp/jybase/mongodb"
+	"fmt"
 	"io/ioutil"
 	"log"
 	"net/http"
@@ -18,8 +19,11 @@ 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 {
 		// 过滤无意义路由日志
@@ -27,6 +31,11 @@ func AddMgoLogs(mgoLog mongodb.MongodbSim, r *http.Request, tableName string, Ex
 			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()
@@ -53,13 +62,54 @@ func AddMgoLogs(mgoLog mongodb.MongodbSim, r *http.Request, tableName string, Ex
 	}
 	saveLogsLock.Lock()
 	arr[tableName] = append(arr[tableName], logs)
-	if len(arr[tableName]) >= c {
+	if len(arr[tableName]) >= saveCount[tableName] {
 		tmp := arr[tableName]
 		arr[tableName] = make([]map[string]interface{}, 0)
-		go func() {
-			log.Println("save..visit..log", len(tmp))
+		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("timer..save..visit..log", 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
+	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)
+}