logfilter.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /**
  2. 日志过滤器
  3. 记录网站所有访问和请求
  4. 2015-7-2
  5. 任政
  6. **/
  7. package filter
  8. import (
  9. util "app.yhyue.com/moapp/jybase/common"
  10. "encoding/json"
  11. "jy-docs/public"
  12. "log"
  13. "net/http"
  14. "net/url"
  15. "strings"
  16. "sync"
  17. "time"
  18. "app.yhyue.com/moapp/jybase/go-xweb/httpsession"
  19. )
  20. var (
  21. arr = []map[string]interface{}{}
  22. //对map的同步
  23. lock = &sync.Mutex{}
  24. )
  25. //日志过滤器
  26. type logFilter struct {
  27. W http.ResponseWriter
  28. R *http.Request
  29. Session *httpsession.Session
  30. //内存缓存日志map
  31. GetSession map[string]interface{}
  32. SetSession map[string]interface{}
  33. }
  34. //继承过滤器方法
  35. func (l *logFilter) Do() bool {
  36. go func() {
  37. l.addLog()
  38. if len(l.SetSession) > 0 {
  39. l.Session.SetMultiple(l.SetSession)
  40. }
  41. }()
  42. return true
  43. }
  44. //定时保存日志
  45. func SaveLogTask() {
  46. lock.Lock()
  47. if len(arr) >= 1 {
  48. tmp := arr
  49. arr = make([]map[string]interface{}, 0)
  50. go func() {
  51. log.Println("timer..save..visit..log", len(tmp))
  52. public.Mgo_Log.SaveBulk("jy_docs_logs", tmp...)
  53. }()
  54. }
  55. lock.Unlock()
  56. time.AfterFunc(5*time.Minute, SaveLogTask)
  57. }
  58. func (l *logFilter) addLog() {
  59. timeNow := time.Now()
  60. agent := l.R.Header.Get("user-agent")
  61. ref := l.R.Referer()
  62. if l.GetSession["brefer"] == nil {
  63. bexist := false
  64. rurl, err := url.ParseRequestURI(ref)
  65. if err == nil && rurl != nil {
  66. host := rurl.Host
  67. if host != "" {
  68. host = strings.Split(host, ":")[0]
  69. if strings.Index("127.0.0.1-www.jianyu360.com", host) < 0 && strings.Index(host, "qmx.top") < 0 {
  70. bexist = true
  71. l.SetSession["brefer"] = 1
  72. l.SetSession["referhost"] = host
  73. }
  74. }
  75. }
  76. if !bexist {
  77. l.SetSession["brefer"] = -1
  78. }
  79. }
  80. s_url := l.R.RequestURI
  81. md, _ := json.Marshal(l.R.Form)
  82. str := string(md)
  83. logs := map[string]interface{}{
  84. "date": timeNow.Unix(),
  85. "ip": util.GetIp(l.R),
  86. "refer": ref,
  87. "year": timeNow.Year(),
  88. "month": timeNow.Month(),
  89. "day": timeNow.Day(),
  90. "hour": timeNow.Hour(),
  91. "minutes": timeNow.Minute(),
  92. "mdescribe": str,
  93. "client": agent,
  94. "os": util.GetOS(agent),
  95. "browse": util.GetBrowse(agent),
  96. "method": l.R.Method,
  97. "url": s_url,
  98. }
  99. if l.GetSession["userId"] != nil {
  100. logs["userid"] = l.GetSession["userId"]
  101. logs["uname"] = l.GetSession["s_nickname"]
  102. }
  103. lock.Lock()
  104. arr = append(arr, logs)
  105. if len(arr) >= 500 || s_url == "/sl" {
  106. tmp := arr
  107. arr = make([]map[string]interface{}, 0)
  108. go func() {
  109. log.Println("save..visit..log", len(tmp))
  110. public.Mgo_Log.SaveBulk("jy_docs_logs", tmp...)
  111. }()
  112. }
  113. lock.Unlock()
  114. }