123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- /*
- *中台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)
- }
|