gitea源码

talimsg.go 1.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // Copyright 2025 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package tailmsg
  4. import (
  5. "sync"
  6. "time"
  7. )
  8. type MsgRecord struct {
  9. Time time.Time
  10. Content string
  11. }
  12. type MsgRecorder interface {
  13. Record(content string)
  14. GetRecords() []*MsgRecord
  15. }
  16. type memoryMsgRecorder struct {
  17. mu sync.RWMutex
  18. msgs []*MsgRecord
  19. limit int
  20. }
  21. // TODO: use redis for a clustered environment
  22. func (m *memoryMsgRecorder) Record(content string) {
  23. m.mu.Lock()
  24. defer m.mu.Unlock()
  25. m.msgs = append(m.msgs, &MsgRecord{
  26. Time: time.Now(),
  27. Content: content,
  28. })
  29. if len(m.msgs) > m.limit {
  30. m.msgs = m.msgs[len(m.msgs)-m.limit:]
  31. }
  32. }
  33. func (m *memoryMsgRecorder) GetRecords() []*MsgRecord {
  34. m.mu.RLock()
  35. defer m.mu.RUnlock()
  36. ret := make([]*MsgRecord, len(m.msgs))
  37. copy(ret, m.msgs)
  38. return ret
  39. }
  40. func NewMsgRecorder(limit int) MsgRecorder {
  41. return &memoryMsgRecorder{
  42. limit: limit,
  43. }
  44. }
  45. type Manager struct {
  46. traceRecorder MsgRecorder
  47. logRecorder MsgRecorder
  48. }
  49. func (m *Manager) GetTraceRecorder() MsgRecorder {
  50. return m.traceRecorder
  51. }
  52. func (m *Manager) GetLogRecorder() MsgRecorder {
  53. return m.logRecorder
  54. }
  55. var GetManager = sync.OnceValue(func() *Manager {
  56. return &Manager{
  57. traceRecorder: NewMsgRecorder(100),
  58. logRecorder: NewMsgRecorder(1000),
  59. }
  60. })