logfilter.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. *
  3. 日志过滤器
  4. 记录网站所有访问和请求
  5. 2015-7-2
  6. 任政
  7. *
  8. */
  9. package filter
  10. import (
  11. "app.yhyue.com/moapp/jybase/go-xweb/xweb"
  12. "app.yhyue.com/moapp/message/db"
  13. "encoding/json"
  14. "net"
  15. "net/http"
  16. "strings"
  17. "time"
  18. "app.yhyue.com/moapp/jybase/go-xweb/httpsession"
  19. )
  20. // 日志过滤器
  21. type logfilter struct {
  22. App *xweb.App
  23. }
  24. // 继承过滤器方法
  25. func (l *logfilter) Do(w http.ResponseWriter, req *http.Request) bool {
  26. session := l.App.SessionManager.Session(req, w)
  27. go addLog(l, session, req)
  28. return true
  29. }
  30. // 用线程处理,增加日志
  31. func addLog(l *logfilter, session *httpsession.Session, req *http.Request) {
  32. timeNow := time.Now()
  33. md, _ := json.Marshal(req.Form)
  34. logs := map[string]interface{}{
  35. "createtime": timeNow,
  36. "ip": GetIp(req),
  37. "refer": req.Referer(),
  38. "year": timeNow.Year(),
  39. "month": timeNow.Month(),
  40. "day": timeNow.Day(),
  41. "hour": timeNow.Hour(),
  42. "minutes": timeNow.Minute(),
  43. "describe": string(md),
  44. "client": req.Header.Get("user-agent"),
  45. "method": req.Method,
  46. "url": req.RequestURI,
  47. }
  48. if session.Get("userId") != nil {
  49. logs["userid"] = session.Get("userId")
  50. logs["nickname"] = session.Get("s_nickname")
  51. }
  52. db.MgoLog.Save("jymessage_logs", logs)
  53. }
  54. // 获取请求ip
  55. func GetIp(req *http.Request) string {
  56. if req == nil {
  57. return ""
  58. }
  59. ip_for := req.Header.Get("x-forwarded-for")
  60. ip_client := req.Header.Get("http_client_ip")
  61. ip_addr := req.Header.Get("Remote_addr")
  62. un := "unknown"
  63. if (ip_for != un) && (len(strings.TrimSpace(ip_for)) > 0) {
  64. return ip_for
  65. }
  66. if (ip_client != un) && (len(strings.TrimSpace(ip_client)) > 0) {
  67. return ip_client
  68. }
  69. if (ip_addr != un) && (len(strings.TrimSpace(ip_addr)) > 0) {
  70. return ip_addr
  71. }
  72. ip, _, _ := net.SplitHostPort(req.RemoteAddr)
  73. return ip
  74. }