log_buf.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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/krn/ktypes"
  8. )
  9. // logBuf -- потокобезопасный буфер лога
  10. type logBuf struct {
  11. sync.RWMutex
  12. lst []ILogMsg
  13. lstErr []ILogMsg
  14. }
  15. // NewLogBuf -- возвращает новый потокобезопасный буфер лога
  16. func NewLogBuf() ILogBuf {
  17. sf := &logBuf{
  18. lst: []ILogMsg{},
  19. lstErr: []ILogMsg{},
  20. }
  21. return sf
  22. }
  23. // GetErr -- возвращает сообщение ошибки по номеру
  24. func (sf *logBuf) GetErr(num int) ILogMsg {
  25. sf.RLock()
  26. defer sf.RUnlock()
  27. if len(sf.lstErr) == 0 {
  28. return log_msg.NewLogMsg(log_msg.DEBUG, "not error msg")
  29. }
  30. if num >= len(sf.lstErr) {
  31. return sf.lstErr[len(sf.lstErr)-1]
  32. }
  33. if num <= 0 {
  34. return sf.lstErr[0]
  35. }
  36. return sf.lstErr[num]
  37. }
  38. // Get -- возвращает сообщение по номеру
  39. func (sf *logBuf) Get(num int) ILogMsg {
  40. sf.RLock()
  41. defer sf.RUnlock()
  42. if len(sf.lst) == 0 {
  43. return log_msg.NewLogMsg(log_msg.DEBUG, "*no msg*")
  44. }
  45. if num >= len(sf.lst) {
  46. return log_msg.NewLogMsg(log_msg.DEBUG, "*no msg*")
  47. }
  48. if num <= 0 {
  49. return log_msg.NewLogMsg(log_msg.DEBUG, "*no msg*")
  50. }
  51. return sf.lst[num]
  52. }
  53. type tMsg struct {
  54. text string
  55. args []any
  56. }
  57. // Debug -- сообщение отладки
  58. func (sf *logBuf) Debug(fMsg string, args ...any) {
  59. sf.Lock()
  60. defer sf.Unlock()
  61. msg := tMsg{
  62. text: fMsg,
  63. args: args,
  64. }
  65. strMsg := fmt.Sprintf(msg.text, msg.args...)
  66. _msg := log_msg.NewLogMsg(log_msg.DEBUG, strMsg)
  67. sf.lst = append(sf.lst, _msg)
  68. sf.checkLen()
  69. }
  70. // Info -- информационные сообщения
  71. func (sf *logBuf) Info(fMsg string, args ...any) {
  72. sf.Lock()
  73. defer sf.Unlock()
  74. msg := tMsg{
  75. text: fMsg,
  76. args: args,
  77. }
  78. strMsg := fmt.Sprintf(msg.text, msg.args...)
  79. _msg := log_msg.NewLogMsg(log_msg.INFO, strMsg)
  80. sf.lst = append(sf.lst, _msg)
  81. sf.checkLen()
  82. }
  83. // Warn -- предупреждающие сообщения
  84. func (sf *logBuf) Warn(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.WARN, strMsg)
  93. sf.lst = append(sf.lst, _msg)
  94. sf.checkLen()
  95. }
  96. // Err -- сообщения об ошибках
  97. func (sf *logBuf) Err(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.ERROR, strMsg)
  106. sf.lst = append(sf.lst, _msg)
  107. sf.lstErr = append(sf.lstErr, _msg)
  108. sf.checkLen()
  109. sf.checkLenErr()
  110. }
  111. // Size -- возвращает размер буфера
  112. func (sf *logBuf) Size() int {
  113. sf.RLock()
  114. defer sf.RUnlock()
  115. return len(sf.lst)
  116. }
  117. // Проверяет длину общую лога
  118. func (sf *logBuf) checkLen() {
  119. for len(sf.lst) > 100 {
  120. sf.lst = sf.lst[1:]
  121. }
  122. }
  123. // Проверяет длину лога ошибок
  124. func (sf *logBuf) checkLenErr() {
  125. for len(sf.lstErr) > 100 {
  126. sf.lstErr = sf.lstErr[1:]
  127. }
  128. }