zp.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. * Copyright (c) 2000-2018, 达梦数据库有限公司.
  3. * All rights reserved.
  4. */
  5. package dm
  6. import (
  7. "fmt"
  8. "os"
  9. "strconv"
  10. "strings"
  11. "time"
  12. "gitee.com/chunanyong/dm/util"
  13. )
  14. const (
  15. MAX_FILE_SIZE = 100 * 1024 * 1024
  16. FLUSH_SIZE = 32 * 1024
  17. )
  18. type goRun interface {
  19. doRun()
  20. }
  21. type logWriter struct {
  22. flushQueue chan []byte
  23. date string
  24. logFile *os.File
  25. flushFreq int
  26. filePath string
  27. filePrefix string
  28. buffer *Dm_build_283
  29. }
  30. func (lw *logWriter) doRun() {
  31. defer func() {
  32. lw.beforeExit()
  33. lw.closeCurrentFile()
  34. }()
  35. i := 0
  36. for {
  37. var ibytes []byte
  38. select {
  39. case ibytes = <-lw.flushQueue:
  40. if LogLevel != LOG_OFF {
  41. if i == LogFlushQueueSize {
  42. lw.doFlush(lw.buffer)
  43. i = 0
  44. } else {
  45. lw.buffer.Dm_build_309(ibytes, 0, len(ibytes))
  46. i++
  47. }
  48. }
  49. case <-time.After(time.Duration(LogFlushFreq) * time.Millisecond):
  50. if LogLevel != LOG_OFF && lw.buffer.Dm_build_288() > 0 {
  51. lw.doFlush(lw.buffer)
  52. i = 0
  53. }
  54. }
  55. }
  56. }
  57. func (lw *logWriter) doFlush(buffer *Dm_build_283) {
  58. if lw.needCreateNewFile() {
  59. lw.closeCurrentFile()
  60. lw.logFile = lw.createNewFile()
  61. }
  62. if lw.logFile != nil {
  63. buffer.Dm_build_303(lw.logFile, buffer.Dm_build_288())
  64. }
  65. }
  66. func (lw *logWriter) closeCurrentFile() {
  67. if lw.logFile != nil {
  68. lw.logFile.Close()
  69. lw.logFile = nil
  70. }
  71. }
  72. func (lw *logWriter) createNewFile() *os.File {
  73. lw.date = time.Now().Format("2006-01-02")
  74. fileName := lw.filePrefix + "_" + lw.date + "_" + strconv.Itoa(time.Now().Nanosecond()) + ".log"
  75. lw.filePath = LogDir
  76. if len(lw.filePath) > 0 {
  77. if _, err := os.Stat(lw.filePath); err != nil {
  78. os.MkdirAll(lw.filePath, 0755)
  79. }
  80. if _, err := os.Stat(lw.filePath + fileName); err != nil {
  81. logFile, err := os.Create(lw.filePath + fileName)
  82. if err != nil {
  83. fmt.Println(err)
  84. return nil
  85. }
  86. return logFile
  87. }
  88. }
  89. return nil
  90. }
  91. func (lw *logWriter) needCreateNewFile() bool {
  92. now := time.Now().Format("2006-01-02")
  93. fileInfo, err := lw.logFile.Stat()
  94. return now != lw.date || err != nil || lw.logFile == nil || fileInfo.Size() > int64(MAX_FILE_SIZE)
  95. }
  96. func (lw *logWriter) beforeExit() {
  97. close(lw.flushQueue)
  98. var ibytes []byte
  99. for ibytes = <-lw.flushQueue; ibytes != nil; ibytes = <-lw.flushQueue {
  100. lw.buffer.Dm_build_309(ibytes, 0, len(ibytes))
  101. if lw.buffer.Dm_build_288() >= LogBufferSize {
  102. lw.doFlush(lw.buffer)
  103. }
  104. }
  105. if lw.buffer.Dm_build_288() > 0 {
  106. lw.doFlush(lw.buffer)
  107. }
  108. }
  109. func (lw *logWriter) WriteLine(msg string) {
  110. var b = []byte(strings.TrimSpace(msg) + util.LINE_SEPARATOR)
  111. lw.flushQueue <- b
  112. }