slog.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package slog
  2. import (
  3. "fmt"
  4. "log"
  5. "strings"
  6. "sync"
  7. "time"
  8. "wartank/pkg/components/kernel/slog/slog_file"
  9. "wartank/pkg/components/kernel/slog/slog_term"
  10. "wartank/pkg/components/safe_bool"
  11. "wartank/pkg/cons"
  12. "wartank/pkg/types"
  13. )
  14. /*
  15. Попытка сделать логирование в файл и консоль
  16. */
  17. const (
  18. strSlog = "ISlog"
  19. LevelDebug = iota
  20. LevelInfo
  21. LevelWarn
  22. LevelError
  23. )
  24. // Слог -- лог событий для записи
  25. type Слог struct {
  26. kern types.ИЯдро
  27. buf strings.Builder
  28. block sync.RWMutex
  29. lf *slog_file.СлогФайл
  30. lt *slog_term.SlogTerm
  31. isWork *safe_bool.БезопБул
  32. level int // Уровень логирования
  33. }
  34. // НовСлог -- возвращает объект логирования
  35. func НовСлог(kern types.ИЯдро) (*Слог, error) {
  36. if kern == nil {
  37. return nil, fmt.Errorf("NewSlog(): IKernel is nil")
  38. }
  39. сам := &Слог{
  40. kern: kern,
  41. buf: strings.Builder{},
  42. lt: slog_term.NewSlogTerm(),
  43. isWork: safe_bool.НовБезопБул(),
  44. level: LevelDebug,
  45. }
  46. lf, err := slog_file.НовСлогФайл(kern, "test")
  47. if err != nil {
  48. return nil, fmt.Errorf("НовСлог(): in create SlogFile, err=\n\t%w", err)
  49. }
  50. сам.lf = lf
  51. go сам.close()
  52. сам.isWork.Уст()
  53. ош := сам.kern.Wg().Add(strSlog)
  54. if ош != nil {
  55. return nil, fmt.Errorf("НовСлог(): при добавлении группы ожидания %q, ош=\n\t%w", strSlog, ош)
  56. }
  57. сам.Инфо("НовСлог()\n")
  58. _ = types.ИЛоггер(сам)
  59. return сам, nil
  60. }
  61. // Паника -- проверяет на правильное утверждение
  62. func (сам *Слог) Паника(усл bool, формат string, значения ...interface{}) {
  63. if !усл {
  64. panic(fmt.Sprintf(формат, значения...))
  65. }
  66. }
  67. // Отладка -- выводит в лог отладочную инфу
  68. func (сам *Слог) Отладка(str string, lstVal ...interface{}) {
  69. сам.block.Lock()
  70. defer сам.block.Unlock()
  71. if !сам.isWork.Получ() {
  72. return
  73. }
  74. сам.printf("DEBUG", str, lstVal...)
  75. }
  76. // Инфо -- выводит в лог дежурную инфу
  77. func (сам *Слог) Инфо(str string, lstVal ...interface{}) {
  78. сам.block.Lock()
  79. defer сам.block.Unlock()
  80. if !сам.isWork.Получ() {
  81. return
  82. }
  83. сам.printf("INFO", str, lstVal...)
  84. }
  85. // Внимание -- выводит в лог предупредительную инфу
  86. func (сам *Слог) Внимание(str string, lstVal ...interface{}) {
  87. сам.block.Lock()
  88. defer сам.block.Unlock()
  89. if !сам.isWork.Получ() {
  90. return
  91. }
  92. сам.printf("WARN", str, lstVal...)
  93. }
  94. // Ошибка -- выводит в лог инфу об ошибках
  95. func (сам *Слог) Ошибка(str string, lstVal ...interface{}) {
  96. сам.block.Lock()
  97. defer сам.block.Unlock()
  98. if !сам.isWork.Получ() {
  99. return
  100. }
  101. сам.printf("ERROR", str, lstVal...)
  102. }
  103. // Внутренний вызов без блокировки
  104. func (сам *Слог) printf(pref, str string, lstVal ...interface{}) {
  105. style := ""
  106. switch pref {
  107. case "DEBUG": // Режим отладки
  108. style = "\033[2;37;40m"
  109. // case "PRINT": // Режим печати
  110. // style = "\033[0;34;40m"
  111. case "INFO": // Режим информирования
  112. style = "\033[0;37;40m"
  113. case "WARN": // Режим предупреждения
  114. style = "\033[1;31;40m"
  115. case "ERROR": // Режим ошибки
  116. style = "\033[1;37;41m"
  117. }
  118. strTime := time.Now().Local().Format("2006-01-02 15:04:05.000\t")
  119. сам.buf.WriteString(strTime + "\t")
  120. сам.buf.WriteString(pref + "\t")
  121. сам.buf.WriteString(cons.СамИмя + "\n\t")
  122. сам.buf.WriteString(fmt.Sprintf(str, lstVal...))
  123. сам.lf.Write(сам.buf.String())
  124. сам.lt.Write(style + сам.buf.String() + "\033[00m")
  125. сам.buf.Reset()
  126. }
  127. // Ожидает закрытия приложения
  128. func (сам *Слог) close() {
  129. <-сам.kern.Done()
  130. сам.block.Lock()
  131. defer сам.block.Unlock()
  132. if !сам.isWork.Получ() {
  133. return
  134. }
  135. сам.isWork.Сброс()
  136. ош := сам.kern.Wg().Done(strSlog)
  137. if ош != nil {
  138. log.Printf("Слог.close(): при удалении группы ожидания, ош=\n\t%v", ош)
  139. }
  140. сам.kern.Отменить()
  141. }