123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- package mux
- import (
- "fmt"
- "github.com/astaxie/beego/logs"
- "net/http"
- "sort"
- "strconv"
- "strings"
- "sync"
- "time"
- )
- type connLog struct {
- startTime time.Time
- isClose bool
- logs []string
- }
- var logms map[int]*connLog
- var logmc map[int]*connLog
- var copyMaps map[int]*connLog
- var copyMapc map[int]*connLog
- var stashTimeNow time.Time
- var mutex sync.Mutex
- func deepCopyMaps() {
- copyMaps = make(map[int]*connLog)
- for k, v := range logms {
- copyMaps[k] = &connLog{
- startTime: v.startTime,
- isClose: v.isClose,
- logs: v.logs,
- }
- }
- }
- func deepCopyMapc() {
- copyMapc = make(map[int]*connLog)
- for k, v := range logmc {
- copyMapc[k] = &connLog{
- startTime: v.startTime,
- isClose: v.isClose,
- logs: v.logs,
- }
- }
- }
- func init() {
- logms = make(map[int]*connLog)
- logmc = make(map[int]*connLog)
- }
- type IntSlice []int
- func (s IntSlice) Len() int { return len(s) }
- func (s IntSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
- func (s IntSlice) Less(i, j int) bool { return s[i] < s[j] }
- func NewLogServer() {
- http.HandleFunc("/", index)
- http.HandleFunc("/detail", detail)
- http.HandleFunc("/stash", stash)
- fmt.Println(http.ListenAndServe(":8899", nil))
- }
- func stash(w http.ResponseWriter, r *http.Request) {
- stashTimeNow = time.Now()
- deepCopyMaps()
- deepCopyMapc()
- w.Write([]byte("ok"))
- }
- func getM(label string, id int) (cL *connLog) {
- label = strings.TrimSpace(label)
- mutex.Lock()
- defer mutex.Unlock()
- if label == "nps" {
- cL = logms[id]
- }
- if label == "npc" {
- cL = logmc[id]
- }
- return
- }
- func setM(label string, id int, cL *connLog) {
- label = strings.TrimSpace(label)
- mutex.Lock()
- defer mutex.Unlock()
- if label == "nps" {
- logms[id] = cL
- }
- if label == "npc" {
- logmc[id] = cL
- }
- }
- func index(w http.ResponseWriter, r *http.Request) {
- var keys []int
- for k := range copyMaps {
- keys = append(keys, k)
- }
- sort.Sort(IntSlice(keys))
- var s string
- s += "<h1>nps</h1>"
- for _, v := range keys {
- connL := copyMaps[v]
- s += "<a href='/detail?id=" + strconv.Itoa(v) + "&label=nps" + "'>" + strconv.Itoa(v) + "</a>----------"
- s += strconv.Itoa(int(stashTimeNow.Sub(connL.startTime).Milliseconds())) + "ms----------"
- s += strconv.FormatBool(connL.isClose)
- s += "<br>"
- }
- keys = keys[:0]
- s += "<h1>npc</h1>"
- for k := range copyMapc {
- keys = append(keys, k)
- }
- sort.Sort(IntSlice(keys))
- for _, v := range keys {
- connL := copyMapc[v]
- s += "<a href='/detail?id=" + strconv.Itoa(v) + "&label=npc" + "'>" + strconv.Itoa(v) + "</a>----------"
- s += strconv.Itoa(int(stashTimeNow.Sub(connL.startTime).Milliseconds())) + "ms----------"
- s += strconv.FormatBool(connL.isClose)
- s += "<br>"
- }
- w.Write([]byte(s))
- }
- func detail(w http.ResponseWriter, r *http.Request) {
- id := r.FormValue("id")
- label := r.FormValue("label")
- logs.Warn(label)
- i, _ := strconv.Atoi(id)
- var v *connLog
- if label == "nps" {
- v, _ = copyMaps[i]
- }
- if label == "npc" {
- v, _ = copyMapc[i]
- }
- var s string
- if v != nil {
- for i, vv := range v.logs {
- s += "<p>" + strconv.Itoa(i+1) + ":" + vv + "</p>"
- }
- }
- w.Write([]byte(s))
- }
|