log_buf.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. // package log_buf -- потокобезопасный буфер лога
  2. package log_buf
  3. import (
  4. "fmt"
  5. "sync"
  6. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
  7. "gitp78su.ipnodns.ru/svi/kern/kc/log_buf/log_msg"
  8. "gitp78su.ipnodns.ru/svi/kern/kc/safe_bool"
  9. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  10. )
  11. // logBuf -- потокобезопасный буфер лога
  12. type logBuf struct {
  13. sync.RWMutex
  14. isTerm ISafeBool // Признак вывода в стандартный поток
  15. lst []ILogMsg
  16. lstErr []ILogMsg
  17. }
  18. // NewLogBuf -- возвращает новый потокобезопасный буфер лога
  19. func NewLogBuf(isTerm bool) ILogBuf {
  20. sf := &logBuf{
  21. isTerm: safe_bool.NewSafeBool(),
  22. lst: []ILogMsg{},
  23. lstErr: []ILogMsg{},
  24. }
  25. if isTerm {
  26. sf.IsTerm().Set()
  27. }
  28. return sf
  29. }
  30. // IsTerm -- возвращает признак логирования
  31. func (sf *logBuf) IsTerm() ISafeBool {
  32. return sf.isTerm
  33. }
  34. // GetErr -- возвращает сообщение ошибки по номеру
  35. func (sf *logBuf) GetErr(num int) ILogMsg {
  36. sf.RLock()
  37. defer sf.RUnlock()
  38. if len(sf.lstErr) == 0 {
  39. return log_msg.NewLogMsg(log_msg.DEBUG, "not error msg")
  40. }
  41. if num >= len(sf.lstErr) {
  42. return sf.lstErr[len(sf.lstErr)-1]
  43. }
  44. if num <= 0 {
  45. return sf.lstErr[0]
  46. }
  47. return sf.lstErr[num]
  48. }
  49. // Get -- возвращает сообщение по номеру
  50. func (sf *logBuf) Get(num int) ILogMsg {
  51. sf.RLock()
  52. defer sf.RUnlock()
  53. if len(sf.lst) == 0 {
  54. return log_msg.NewLogMsg(log_msg.DEBUG, "*no msg*")
  55. }
  56. if num >= len(sf.lst) {
  57. return log_msg.NewLogMsg(log_msg.DEBUG, "*no msg*")
  58. }
  59. if num <= 0 {
  60. return log_msg.NewLogMsg(log_msg.DEBUG, "*no msg*")
  61. }
  62. return sf.lst[num]
  63. }
  64. type tMsg struct {
  65. text string
  66. args []any
  67. }
  68. // Debug -- сообщение отладки
  69. func (sf *logBuf) Debug(fMsg string, args ...any) {
  70. sf.Lock()
  71. defer sf.Unlock()
  72. msg := tMsg{
  73. text: fMsg,
  74. args: args,
  75. }
  76. strMsg := fmt.Sprintf(msg.text, msg.args...)
  77. _msg := log_msg.NewLogMsg(log_msg.DEBUG, strMsg)
  78. sf.lst = append(sf.lst, _msg)
  79. sf.checkLen()
  80. sf.printTerm(_msg)
  81. }
  82. // Info -- информационные сообщения
  83. func (sf *logBuf) Info(fMsg string, args ...any) {
  84. sf.Lock()
  85. defer sf.Unlock()
  86. msg := tMsg{
  87. text: fMsg,
  88. args: args,
  89. }
  90. strMsg := fmt.Sprintf(msg.text, msg.args...)
  91. _msg := log_msg.NewLogMsg(log_msg.INFO, strMsg)
  92. sf.lst = append(sf.lst, _msg)
  93. sf.checkLen()
  94. sf.printTerm(_msg)
  95. }
  96. // Warn -- предупреждающие сообщения
  97. func (sf *logBuf) Warn(fMsg string, args ...any) {
  98. sf.Lock()
  99. defer sf.Unlock()
  100. msg := tMsg{
  101. text: fMsg,
  102. args: args,
  103. }
  104. strMsg := fmt.Sprintf(msg.text, msg.args...)
  105. _msg := log_msg.NewLogMsg(log_msg.WARN, strMsg)
  106. sf.lst = append(sf.lst, _msg)
  107. sf.checkLen()
  108. sf.printTerm(_msg)
  109. }
  110. // Err -- сообщения об ошибках
  111. func (sf *logBuf) Err(fMsg string, args ...any) {
  112. sf.Lock()
  113. defer sf.Unlock()
  114. msg := tMsg{
  115. text: fMsg,
  116. args: args,
  117. }
  118. strMsg := fmt.Sprintf(msg.text, msg.args...)
  119. _msg := log_msg.NewLogMsg(log_msg.ERROR, strMsg)
  120. sf.lst = append(sf.lst, _msg)
  121. sf.lstErr = append(sf.lstErr, _msg)
  122. sf.checkLen()
  123. sf.checkLenErr()
  124. sf.printTerm(_msg)
  125. }
  126. // Size -- возвращает размер буфера
  127. func (sf *logBuf) Size() int {
  128. sf.RLock()
  129. defer sf.RUnlock()
  130. return len(sf.lst)
  131. }
  132. // Проверяет длину общую лога
  133. func (sf *logBuf) checkLen() {
  134. for len(sf.lst) > 100 {
  135. sf.lst = sf.lst[1:]
  136. }
  137. }
  138. // Проверяет длину лога ошибок
  139. func (sf *logBuf) checkLenErr() {
  140. for len(sf.lstErr) > 100 {
  141. sf.lstErr = sf.lstErr[1:]
  142. }
  143. }
  144. // Печатает сообщение в терминал, если разрешено
  145. func (sf *logBuf) printTerm(msg ILogMsg) {
  146. if !sf.isTerm.Get() {
  147. return
  148. }
  149. level := msg.Level()
  150. if helpers.IsStageProd {
  151. switch level {
  152. case "ERRO", "WARN":
  153. fmt.Printf("%v %v\n", level, msg.String())
  154. default:
  155. return
  156. }
  157. }
  158. fmt.Printf("%v\n", msg.String())
  159. }