logfileview.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /**
  2. * @Author: zou.yingbin
  3. * @Create : 2021/10/18 9:52
  4. * @Modify : 2021/10/18 9:52
  5. * @note : 查看日志文件内容
  6. */
  7. package other
  8. import (
  9. "bufio"
  10. "fmt"
  11. "github.com/gin-gonic/gin"
  12. "html/template"
  13. "mtp2_if/config"
  14. "net/http"
  15. "os"
  16. "strings"
  17. )
  18. // LogView 查看日志文件内容
  19. func LogView(c *gin.Context) {
  20. // 最多显示最新100行, 如果要查看更多, 请下载文件
  21. filename := c.DefaultQuery("filename", "")
  22. if filename == "" {
  23. c.JSON(http.StatusBadRequest, gin.H{"message": "param error"})
  24. return
  25. }
  26. str := getFileContent(filename, 200)
  27. //c.String(http.StatusOK, str)
  28. const templateText = `
  29. <p>
  30. <h1></h1>
  31. <h3> 日志文件内容(只显示最新的n行) </h3>
  32. -------------------<br>
  33. </p>
  34. <p>
  35. {{.data}}
  36. </p>
  37. `
  38. if tmpl, err := template.New("index").Parse(templateText); err == nil {
  39. _ = tmpl.Execute(c.Writer, gin.H{"data": template.HTML(str)})
  40. } else {
  41. c.String(400, "template err")
  42. }
  43. }
  44. // getFileContent 获取文件内容
  45. func getFileContent(filename string, nLines int) string {
  46. fileDir := config.SerCfg.LogCfg.LogPath
  47. if len(fileDir) > 0 {
  48. if nLen := len(fileDir); fileDir[nLen-1] != '/' {
  49. fileDir += "/"
  50. }
  51. }
  52. file, err := os.Open(fileDir + filename)
  53. if err != nil {
  54. return "file not found"
  55. }
  56. // bufio.Scan默认缓冲区大小只有40000, 如果不设置缓存区, 遇到数据大于40000的将返回false
  57. const maxCapacity = 512 * 1024
  58. buf := make([]byte, maxCapacity)
  59. scanner := bufio.NewScanner(file)
  60. scanner.Buffer(buf, maxCapacity)
  61. total := 0
  62. for scanner.Scan() {
  63. total++
  64. }
  65. readPos := 0
  66. if total > nLines {
  67. readPos = total - nLines
  68. }
  69. txt := ""
  70. file.Seek(0, 0)
  71. index := 0
  72. s := bufio.NewScanner(file)
  73. s.Buffer(buf, maxCapacity)
  74. for s.Scan() {
  75. if index >= readPos {
  76. str := s.Text()
  77. if strings.Contains(str, "[SQL]") {
  78. p1 := strings.Index(str, "[SQL]")
  79. p2 := strings.LastIndex(str, "[")
  80. if p1 != -1 && p2 != -1 {
  81. if p1+5 < len(str) {
  82. p1 += 5 // 往前移5个字符, 不包含[SQL]
  83. }
  84. if p2 > p1 {
  85. str1 := str[0:p1]
  86. str2 := str[p1:p2]
  87. str3 := str[p2:]
  88. str = str1 + setFontColor(str2, "#FF00FF") + str3
  89. txt += str + "<br>"
  90. } else {
  91. str = setFontColor(str, "#FF00FF")
  92. txt += str + "<br>"
  93. }
  94. } else {
  95. // #FF00FF 紫色
  96. str = setFontColor(str, "#FF00FF")
  97. txt += str + "<br>"
  98. }
  99. } else if strings.Contains(str, `GET /api/`) {
  100. // #0000FF 蓝色
  101. str = setFontColor(str, "#0000FF")
  102. txt += str + "<br>"
  103. } else {
  104. txt += str + "<br>"
  105. }
  106. }
  107. index++
  108. }
  109. txt = setColorForSubString(txt, "FROM", "#DC143C")
  110. txt = setColorForSubString(txt, "from", "#DC143C")
  111. return txt
  112. }
  113. // 设置字体颜色
  114. func setFontColor(str string, clr string) string {
  115. return fmt.Sprintf(`<font color="%v">%v</font>`, clr, str)
  116. }
  117. // 为某个子串设置颜色
  118. func setColorForSubString(str string, subStr string, clr string) string {
  119. newStr := setFontColor(subStr, clr)
  120. return strings.ReplaceAll(str, subStr, newStr)
  121. }