logger.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package cert
  2. import (
  3. "fmt"
  4. "strings"
  5. "sync"
  6. "time"
  7. "github.com/0xJacky/Nginx-UI/internal/translation"
  8. "github.com/0xJacky/Nginx-UI/model"
  9. "github.com/gorilla/websocket"
  10. "github.com/uozi-tech/cosy/logger"
  11. )
  12. type Logger struct {
  13. buffer []string
  14. cert *model.Cert
  15. ws *websocket.Conn
  16. trans *translation.Container
  17. mu sync.Mutex
  18. msgCh chan []byte
  19. done chan struct{}
  20. }
  21. func NewLogger() *Logger {
  22. l := &Logger{
  23. msgCh: make(chan []byte, 100),
  24. done: make(chan struct{}),
  25. }
  26. go l.processMessages()
  27. return l
  28. }
  29. func (t *Logger) processMessages() {
  30. for {
  31. select {
  32. case msg := <-t.msgCh:
  33. t.mu.Lock()
  34. if t.ws != nil {
  35. _ = t.ws.WriteMessage(websocket.TextMessage, msg)
  36. }
  37. t.mu.Unlock()
  38. case <-t.done:
  39. return
  40. }
  41. }
  42. }
  43. func (t *Logger) SetCertModel(cert *model.Cert) {
  44. t.mu.Lock()
  45. defer t.mu.Unlock()
  46. t.cert = cert
  47. }
  48. func (t *Logger) SetWebSocket(ws *websocket.Conn) {
  49. t.mu.Lock()
  50. defer t.mu.Unlock()
  51. t.ws = ws
  52. }
  53. func (t *Logger) Info(c *translation.Container) {
  54. result, err := c.ToJSON()
  55. if err != nil {
  56. return
  57. }
  58. t.mu.Lock()
  59. t.buffer = append(t.buffer, string(result))
  60. t.mu.Unlock()
  61. logger.Info("AutoCert", c.ToString())
  62. t.msgCh <- result
  63. }
  64. func (t *Logger) Error(err error) {
  65. t.mu.Lock()
  66. t.buffer = append(t.buffer, fmt.Sprintf("%s [Error] %s",
  67. time.Now().Format(time.DateTime),
  68. strings.TrimSpace(err.Error()),
  69. ))
  70. t.mu.Unlock()
  71. logger.Error("AutoCert", err)
  72. }
  73. func (t *Logger) Close() {
  74. t.mu.Lock()
  75. defer t.mu.Unlock()
  76. close(t.msgCh)
  77. close(t.done)
  78. if t.cert == nil {
  79. return
  80. }
  81. _ = t.cert.Updates(&model.Cert{
  82. Log: t.ToString(),
  83. })
  84. }
  85. func (t *Logger) ToString() (content string) {
  86. t.mu.Lock()
  87. defer t.mu.Unlock()
  88. content = strings.Join(t.buffer, "\n")
  89. return
  90. }