|
@@ -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)
|
|
|
+}
|