golang web流量统计 上

long · · 2797 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。
#golang web流量统计 上 BLOG: http://blog.csdn.net/webxscan/ <br> BY:斗转星移 QQ:29295842 <br> 自己做流量统计<br> 当你网站访问量过大时 第3方统计系统就不愿意了,这时就需要自己来设计个流量统计了。<br> 有技术交流的可以加我。 ``` package main //golang网站流量统计 上 //QQ:29295842 //http://blog.csdn.net/webxscan //github https://github.com/webxscan/golang_tj import ( "encoding/json" "fmt" "log" "strconv" "strings" "time" "github.com/astaxie/beego" "github.com/astaxie/beego/session" ) var globalSessions *session.Manager type Iindex struct { beego.Controller } func init() { config := fmt.Sprintf(`{"cookieName":"gosessionid","gclifetime":%d,"enableSetCookie":true}`, 3600*24) // conf := new(session.ManagerConfig) if err := json.Unmarshal([]byte(config), conf); err != nil { log.Fatal("json decode error", err) } globalSessions, _ = session.NewManager("memory", conf) go globalSessions.GC() } func main() { beego.BConfig.Listen.ServerTimeOut = 10 //设置 HTTP 的超时时间,默认是 0,不超时。 //beego.BConfig.Listen.EnableHTTP = true //是否启用 HTTP 监听,默认是 true。 beego.BConfig.Listen.HTTPPort = 1000 //应用监听端口,默认为 8080。 //beego.SetLogger("file", `{"filename":"logs/admin.log","maxlines":10000}`) // beego.BConfig.EnableErrorsShow = false //是否显示系统错误信息,默认为 true。 // //是否将错误信息进行渲染,默认值为 true,即出错会提示友好的出错页面,对于 API 类型的应用可能需要将该选项设置为 false 以阻止在 dev 模式下不必要的模板渲染信息返回 // beego.BConfig.EnableErrorsRender = false // //运行模式,可选值为 prod, dev 或者 test. 默认是 dev, 为开发模式 // // beego.BConfig.RunMode = "prod" // //运行模式,可选值为 prod, dev 或者 test. 默认是 dev, 为开发模式 // beego.BConfig.RunMode = "test" beego.BConfig.AppName = "斗转星移" //应用名称,默认是 beego。通过 bee new 创建的是创建的项目名。 beego.BConfig.ServerName = "QQ:29295842" //beego 服务器默认在请求的时候输出 server 为 beego。 beego.BConfig.WebConfig.Session.SessionName = "sessionID" //存在客户端的 cookie 名称,默认值是 beegosessionID。 beego.BConfig.WebConfig.Session.SessionGCMaxLifetime = 3600 * 24 //session 过期时间,默认值是 3600 秒。 beego.BConfig.WebConfig.Session.SessionCookieLifeTime = 3600 * 24 //session 默认存在客户端的 cookie 的时间,默认值是 3600 秒。 //beego.BConfig.WebConfig.Session.SessionDomain = "" //session cookie 存储域名, 默认空。 //beego.BConfig.WebConfig.ViewsPath = "admin" //模板路径,默认值是 views。 beego.Router("/*", &Iindex{}, "*:Count") go beego.Run() //============================================= for { //死循环 time.Sleep(10 * time.Second) } //make一个chan用于阻塞主线程,避免程序退出 // blockMainRoutine := make(chan bool) // <-blockMainRoutine } //网站访问计数器 func (this *Iindex) Count() { path_url := this.Ctx.Request.URL.String() fmt.Println("get url:", path_url) if path_url == "/favicon.ico" { //忽略此路由地址请求 this.Ctx.WriteString("") this.Ctx.ResponseWriter.Header().Set("Content-Type", "text/html") return } //this.Ctx.Request //这里面有大家所需要一切客户信息 fmt.Printf("===%v===\n", this.Ctx.Request) Client_Host := this.Ctx.Request.Host //访问域名 Client_Method := this.Ctx.Request.Method //请求方式 Client_User_Agent := this.Ctx.Request.Header.Get("User-Agent") //请求头 Client_IP := this.Ctx.Request.Header.Get("Remote_addr") //客户端IP Client_Referer := this.Ctx.Request.Header.Get("Referer") //来源 if len(Client_IP) <= 7 { Client_IP = this.Ctx.Request.RemoteAddr //获取客户端IP } if strings.Contains(Client_IP, ":") { ip_boolA, ip_dataA := For_IP(string(Client_IP)) //获取IP if ip_boolA { Client_IP = ip_dataA } } this.Ctx.ResponseWriter.Header().Set("Content-Type", "text/html") this.Ctx.WriteString("golang网站流量统计 上</br>\n") this.Ctx.WriteString("QQ:29295842</br>\n") this.Ctx.WriteString(fmt.Sprintf("=====客户端IP:%v======</br>\n", Client_IP)) this.Ctx.WriteString(fmt.Sprintf("=====访问域名:%v======</br>\n", Client_Host)) this.Ctx.WriteString(fmt.Sprintf("=====请求路径:%v======</br>\n", path_url)) this.Ctx.WriteString(fmt.Sprintf("=====来源来路:%v======</br>\n", Client_Referer)) this.Ctx.WriteString(fmt.Sprintf("=====请求方式:%v======</br>\n", Client_Method)) this.Ctx.WriteString(fmt.Sprintf("=====请求头:%v======</br>\n", Client_User_Agent)) this.Ctx.WriteString(fmt.Sprintf("=====访问次数:%v======</br>\n", this.Cookie_session())) //后面就是数据存贮 可以多种模式 return } func For_IP(valuex string) (bool, string) { data_list := strings.Split(valuex, ":") if len(data_list) >= 2 { return true, data_list[0] } return false, "" } func (this *Iindex) Cookie_session() int { //id统计 PV 这样统计只能针对单个浏览器有效 pv := 0 //===================== //Cookie 统计法 cook := this.Ctx.GetCookie("countnum") //获取Cookie if cook == "" { this.Ctx.SetCookie("countnum", "1", "/") pv = 1 } else { xx, err := strconv.Atoi(cook) if err == nil { pv = xx + 1 this.Ctx.SetCookie("countnum", strconv.Itoa(pv), "/") } else { pv = 0 } } return pv //===================== //session 统计法 sess, _ := globalSessions.SessionStart(this.Ctx.ResponseWriter, this.Ctx.Request) ct := sess.Get("countnum") if ct == nil { sess.Set("countnum", 1) pv = 1 } else { pv = ct.(int) + 1 sess.Set("countnum", pv) } return pv } ``` ![截图.png](http://studygolang.qiniudn.com/170825/eac9c4141d71a1a1df64c1dae9793cb8.png)

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459

2797 次点击  ∙  3 赞  
加入收藏 微博
5 回复  |  直到 2017-08-26 03:43:12
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传