web.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package mux
  2. import (
  3. "fmt"
  4. "github.com/astaxie/beego/logs"
  5. "net/http"
  6. "sort"
  7. "strconv"
  8. "strings"
  9. "sync"
  10. "time"
  11. )
  12. type connLog struct {
  13. startTime time.Time
  14. isClose bool
  15. logs []string
  16. }
  17. var logms map[int]*connLog
  18. var logmc map[int]*connLog
  19. var copyMaps map[int]*connLog
  20. var copyMapc map[int]*connLog
  21. var stashTimeNow time.Time
  22. var mutex sync.Mutex
  23. func deepCopyMaps() {
  24. copyMaps = make(map[int]*connLog)
  25. for k, v := range logms {
  26. copyMaps[k] = &connLog{
  27. startTime: v.startTime,
  28. isClose: v.isClose,
  29. logs: v.logs,
  30. }
  31. }
  32. }
  33. func deepCopyMapc() {
  34. copyMapc = make(map[int]*connLog)
  35. for k, v := range logmc {
  36. copyMapc[k] = &connLog{
  37. startTime: v.startTime,
  38. isClose: v.isClose,
  39. logs: v.logs,
  40. }
  41. }
  42. }
  43. func init() {
  44. logms = make(map[int]*connLog)
  45. logmc = make(map[int]*connLog)
  46. }
  47. type IntSlice []int
  48. func (s IntSlice) Len() int { return len(s) }
  49. func (s IntSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
  50. func (s IntSlice) Less(i, j int) bool { return s[i] < s[j] }
  51. func NewLogServer() {
  52. http.HandleFunc("/", index)
  53. http.HandleFunc("/detail", detail)
  54. http.HandleFunc("/stash", stash)
  55. fmt.Println(http.ListenAndServe(":8899", nil))
  56. }
  57. func stash(w http.ResponseWriter, r *http.Request) {
  58. stashTimeNow = time.Now()
  59. deepCopyMaps()
  60. deepCopyMapc()
  61. w.Write([]byte("ok"))
  62. }
  63. func getM(label string, id int) (cL *connLog) {
  64. label = strings.TrimSpace(label)
  65. mutex.Lock()
  66. defer mutex.Unlock()
  67. if label == "nps" {
  68. cL = logms[id]
  69. }
  70. if label == "npc" {
  71. cL = logmc[id]
  72. }
  73. return
  74. }
  75. func setM(label string, id int, cL *connLog) {
  76. label = strings.TrimSpace(label)
  77. mutex.Lock()
  78. defer mutex.Unlock()
  79. if label == "nps" {
  80. logms[id] = cL
  81. }
  82. if label == "npc" {
  83. logmc[id] = cL
  84. }
  85. }
  86. func index(w http.ResponseWriter, r *http.Request) {
  87. var keys []int
  88. for k := range copyMaps {
  89. keys = append(keys, k)
  90. }
  91. sort.Sort(IntSlice(keys))
  92. var s string
  93. s += "<h1>nps</h1>"
  94. for _, v := range keys {
  95. connL := copyMaps[v]
  96. s += "<a href='/detail?id=" + strconv.Itoa(v) + "&label=nps" + "'>" + strconv.Itoa(v) + "</a>----------"
  97. s += strconv.Itoa(int(stashTimeNow.Sub(connL.startTime).Milliseconds())) + "ms----------"
  98. s += strconv.FormatBool(connL.isClose)
  99. s += "<br>"
  100. }
  101. keys = keys[:0]
  102. s += "<h1>npc</h1>"
  103. for k := range copyMapc {
  104. keys = append(keys, k)
  105. }
  106. sort.Sort(IntSlice(keys))
  107. for _, v := range keys {
  108. connL := copyMapc[v]
  109. s += "<a href='/detail?id=" + strconv.Itoa(v) + "&label=npc" + "'>" + strconv.Itoa(v) + "</a>----------"
  110. s += strconv.Itoa(int(stashTimeNow.Sub(connL.startTime).Milliseconds())) + "ms----------"
  111. s += strconv.FormatBool(connL.isClose)
  112. s += "<br>"
  113. }
  114. w.Write([]byte(s))
  115. }
  116. func detail(w http.ResponseWriter, r *http.Request) {
  117. id := r.FormValue("id")
  118. label := r.FormValue("label")
  119. logs.Warn(label)
  120. i, _ := strconv.Atoi(id)
  121. var v *connLog
  122. if label == "nps" {
  123. v, _ = copyMaps[i]
  124. }
  125. if label == "npc" {
  126. v, _ = copyMapc[i]
  127. }
  128. var s string
  129. if v != nil {
  130. for i, vv := range v.logs {
  131. s += "<p>" + strconv.Itoa(i+1) + ":" + vv + "</p>"
  132. }
  133. }
  134. w.Write([]byte(s))
  135. }