|
@@ -0,0 +1,152 @@
|
|
|
+package parse
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "net"
|
|
|
+ "net/http"
|
|
|
+ "regexp"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ "github.com/influxdata/influxdb-client"
|
|
|
+)
|
|
|
+
|
|
|
+//用户访问日志转换
|
|
|
+type AccessLogParse struct {
|
|
|
+}
|
|
|
+
|
|
|
+//设置tag标签
|
|
|
+var tagtitle = map[string]interface{}{
|
|
|
+ "s_os": true,
|
|
|
+ "s_browse": true,
|
|
|
+ "s_model": true,
|
|
|
+}
|
|
|
+var log_model = map[string]*regexp.Regexp{}
|
|
|
+
|
|
|
+//
|
|
|
+func (alp AccessLogParse) Parse(data map[string]interface{}, req *http.Request) *influxdb.Point {
|
|
|
+ //补充基本数据
|
|
|
+ data = AddBasicData(data, req)
|
|
|
+ fields := map[string]interface{}{}
|
|
|
+ tags := []influxdb.Tag{}
|
|
|
+ for k, v := range data {
|
|
|
+ if tagtitle[k] == nil {
|
|
|
+ fields[k] = v
|
|
|
+ } else {
|
|
|
+ tag := influxdb.Tag{Key: k, Value: fmt.Sprint(v)}
|
|
|
+ tags = append(tags, tag)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ponit := &influxdb.Point{
|
|
|
+ Name: "accesslog",
|
|
|
+ Tags: tags,
|
|
|
+ Fields: fields,
|
|
|
+ Time: time.Now(),
|
|
|
+ }
|
|
|
+ return ponit
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+func AccessLogInit(model map[string]interface{}) {
|
|
|
+ //TODO 加载IP转换,url模块对应
|
|
|
+ for k, v := range model {
|
|
|
+ reg, _ := regexp.Compile(fmt.Sprint(v))
|
|
|
+ log_model[k] = reg
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//补充基本数据字段
|
|
|
+func AddBasicData(data map[string]interface{}, req *http.Request) map[string]interface{} {
|
|
|
+ agent := req.Header.Get("user-agent")
|
|
|
+ data["s_os"] = GetOS(agent)
|
|
|
+ data["s_ip"] = GetIp(req)
|
|
|
+ data["s_browse"] = GetBrowse(agent)
|
|
|
+ data["s_refer"] = req.Referer()
|
|
|
+ data["s_client"] = agent
|
|
|
+ data["s_model"] = GetModel(fmt.Sprint(data["s_url"]))
|
|
|
+ delete(data, "model")
|
|
|
+ return data
|
|
|
+}
|
|
|
+
|
|
|
+//根据url获取所属模块
|
|
|
+func GetModel(url string) string {
|
|
|
+ s_model := "其他"
|
|
|
+ for k, v := range log_model {
|
|
|
+ b := v.MatchString(url)
|
|
|
+ if b {
|
|
|
+ s_model = k
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return s_model
|
|
|
+}
|
|
|
+
|
|
|
+//获取平台类型
|
|
|
+func GetOS(useros string) string {
|
|
|
+ osVersion := "其他"
|
|
|
+ if strings.Contains(useros, "NT 6.0") {
|
|
|
+ osVersion = "Windows Vista/Server 2008"
|
|
|
+ } else if strings.Contains(useros, "NT 5.2") {
|
|
|
+ osVersion = "Windows Server 2003"
|
|
|
+ } else if strings.Contains(useros, "NT 5.1") {
|
|
|
+ osVersion = "Windows XP"
|
|
|
+ } else if strings.Contains(useros, "NT 5") {
|
|
|
+ osVersion = "Windows 2000"
|
|
|
+ } else if strings.Contains(useros, "Mac") {
|
|
|
+ osVersion = "Mac"
|
|
|
+ } else if strings.Contains(useros, "Unix") {
|
|
|
+ osVersion = "UNIX"
|
|
|
+ } else if strings.Contains(useros, "Linux") {
|
|
|
+ osVersion = "Linux"
|
|
|
+ } else if strings.Contains(useros, "SunOS") {
|
|
|
+ osVersion = "SunOS"
|
|
|
+ } else if strings.Contains(useros, "NT 6.3") {
|
|
|
+ osVersion = "Window8"
|
|
|
+ } else if strings.Contains(useros, "NT 6.1") {
|
|
|
+ osVersion = "Window7"
|
|
|
+ } else if strings.Contains(useros, "NT 10.0") {
|
|
|
+ osVersion = "Window10"
|
|
|
+ }
|
|
|
+ return osVersion
|
|
|
+}
|
|
|
+
|
|
|
+//获取浏览器类型
|
|
|
+func GetBrowse(userbrowser string) string {
|
|
|
+ browserVersion := "其他"
|
|
|
+ if strings.Contains(userbrowser, "MSIE") {
|
|
|
+ browserVersion = "IE"
|
|
|
+ } else if strings.Contains(userbrowser, "Firefox") {
|
|
|
+ browserVersion = "Firefox"
|
|
|
+ } else if strings.Contains(userbrowser, "Chrome") {
|
|
|
+ browserVersion = "Chrome"
|
|
|
+ } else if strings.Contains(userbrowser, "Safari") {
|
|
|
+ browserVersion = "Safari"
|
|
|
+ } else if strings.Contains(userbrowser, "rv:11.0") {
|
|
|
+ browserVersion = "IE11"
|
|
|
+ }
|
|
|
+ return browserVersion
|
|
|
+}
|
|
|
+
|
|
|
+//获取ip
|
|
|
+func GetIp(req *http.Request) string {
|
|
|
+ if req == nil {
|
|
|
+ return ""
|
|
|
+ }
|
|
|
+ ip_for := req.Header.Get("x-forwarded-for")
|
|
|
+ ip_client := req.Header.Get("http_client_ip")
|
|
|
+ ip_addr := req.Header.Get("Remote_addr")
|
|
|
+ un := "unknown"
|
|
|
+ if (ip_for != un) && (len(strings.TrimSpace(ip_for)) > 0) {
|
|
|
+ return ip_for
|
|
|
+ }
|
|
|
+ if (ip_client != un) && (len(strings.TrimSpace(ip_client)) > 0) {
|
|
|
+ return ip_client
|
|
|
+ }
|
|
|
+ if (ip_addr != un) && (len(strings.TrimSpace(ip_addr)) > 0) {
|
|
|
+ return ip_addr
|
|
|
+ }
|
|
|
+ ip, _, _ := net.SplitHostPort(req.RemoteAddr)
|
|
|
+ return ip
|
|
|
+}
|