log.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package log
  2. import (
  3. "sync"
  4. "github.com/v2fly/v2ray-core/v5/common/serial"
  5. )
  6. // Message is the interface for all log messages.
  7. type Message interface {
  8. String() string
  9. }
  10. // Handler is the interface for log handler.
  11. type Handler interface {
  12. Handle(msg Message)
  13. }
  14. // Follower is the interface for following logs.
  15. type Follower interface {
  16. AddFollower(func(msg Message))
  17. RemoveFollower(func(msg Message))
  18. }
  19. // GeneralMessage is a general log message that can contain all kind of content.
  20. type GeneralMessage struct {
  21. Severity Severity
  22. Content interface{}
  23. }
  24. // String implements Message.
  25. func (m *GeneralMessage) String() string {
  26. return serial.Concat("[", m.Severity, "] ", m.Content)
  27. }
  28. // Record writes a message into log stream.
  29. func Record(msg Message) {
  30. logHandler.Handle(msg)
  31. }
  32. var logHandler syncHandler
  33. // RegisterHandler register a new handler as current log handler. Previous registered handler will be discarded.
  34. func RegisterHandler(handler Handler) {
  35. if handler == nil {
  36. panic("Log handler is nil")
  37. }
  38. logHandler.Set(handler)
  39. }
  40. type syncHandler struct {
  41. sync.RWMutex
  42. Handler
  43. }
  44. func (h *syncHandler) Handle(msg Message) {
  45. h.RLock()
  46. defer h.RUnlock()
  47. if h.Handler != nil {
  48. h.Handler.Handle(msg)
  49. }
  50. }
  51. func (h *syncHandler) Set(handler Handler) {
  52. h.Lock()
  53. defer h.Unlock()
  54. h.Handler = handler
  55. }