slog.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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. return сам, nil
  59. }
  60. // Отладка -- выводит в лог отладочную инфу
  61. func (сам *Слог) Отладка(str string, lstVal ...interface{}) {
  62. сам.block.Lock()
  63. defer сам.block.Unlock()
  64. if !сам.isWork.Получ() {
  65. return
  66. }
  67. сам.printf("DEBUG", str, lstVal...)
  68. }
  69. // Инфо -- выводит в лог дежурную инфу
  70. func (сам *Слог) Инфо(str string, lstVal ...interface{}) {
  71. сам.block.Lock()
  72. defer сам.block.Unlock()
  73. if !сам.isWork.Получ() {
  74. return
  75. }
  76. сам.printf("INFO", str, lstVal...)
  77. }
  78. // Внимание -- выводит в лог предупредительную инфу
  79. func (сам *Слог) Внимание(str string, lstVal ...interface{}) {
  80. сам.block.Lock()
  81. defer сам.block.Unlock()
  82. if !сам.isWork.Получ() {
  83. return
  84. }
  85. сам.printf("WARN", str, lstVal...)
  86. }
  87. // Ошибка -- выводит в лог инфу об ошибках
  88. func (сам *Слог) Ошибка(str string, lstVal ...interface{}) {
  89. сам.block.Lock()
  90. defer сам.block.Unlock()
  91. if !сам.isWork.Получ() {
  92. return
  93. }
  94. сам.printf("ERROR", str, lstVal...)
  95. }
  96. // Внутренний вызов без блокировки
  97. func (сам *Слог) printf(pref, str string, lstVal ...interface{}) {
  98. style := ""
  99. switch pref {
  100. case "DEBUG": // Режим отладки
  101. style = "\033[2;37;40m"
  102. // case "PRINT": // Режим печати
  103. // style = "\033[0;34;40m"
  104. case "INFO": // Режим информирования
  105. style = "\033[0;37;40m"
  106. case "WARN": // Режим предупреждения
  107. style = "\033[1;31;40m"
  108. case "ERROR": // Режим ошибки
  109. style = "\033[1;37;41m"
  110. }
  111. strTime := time.Now().Local().Format("2006-01-02 15:04:05.000\t")
  112. сам.buf.WriteString(strTime + "\t")
  113. сам.buf.WriteString(pref + "\t")
  114. сам.buf.WriteString(cons.СамИмя + "\n\t")
  115. сам.buf.WriteString(fmt.Sprintf(str, lstVal...))
  116. сам.lf.Write(сам.buf.String())
  117. сам.lt.Write(style + сам.buf.String() + "\033[00m")
  118. сам.buf.Reset()
  119. }
  120. // Ожидает закрытия приложения
  121. func (сам *Слог) close() {
  122. <-сам.kern.Done()
  123. сам.block.Lock()
  124. defer сам.block.Unlock()
  125. if !сам.isWork.Получ() {
  126. return
  127. }
  128. сам.isWork.Сброс()
  129. ош := сам.kern.Wg().Done(strSlog)
  130. if ош != nil {
  131. log.Printf("Слог.close(): при удалении группы ожидания, ош=\n\t%v", ош)
  132. }
  133. сам.kern.Отменить()
  134. }