log_buf.go 3.6 KB

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