log.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package log
  2. import (
  3. "sync"
  4. "v2ray.com/core/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. // GeneralMessage is a general log message that can contain all kind of content.
  15. type GeneralMessage struct {
  16. Severity Severity
  17. Content interface{}
  18. }
  19. // String implements Message.
  20. func (m *GeneralMessage) String() string {
  21. return serial.Concat("[", m.Severity, "] ", m.Content)
  22. }
  23. // Record writes a message into log stream.
  24. func Record(msg Message) {
  25. logHandler.Handle(msg)
  26. }
  27. var (
  28. logHandler syncHandler
  29. )
  30. // RegisterHandler register a new handler as current log handler. Previous registered handler will be discarded.
  31. func RegisterHandler(handler Handler) {
  32. if handler == nil {
  33. panic("Log handler is nil")
  34. }
  35. logHandler.Set(handler)
  36. }
  37. type syncHandler struct {
  38. sync.RWMutex
  39. Handler
  40. }
  41. func (h *syncHandler) Handle(msg Message) {
  42. h.RLock()
  43. defer h.RUnlock()
  44. if h.Handler != nil {
  45. h.Handler.Handle(msg)
  46. }
  47. }
  48. func (h *syncHandler) Set(handler Handler) {
  49. h.Lock()
  50. defer h.Unlock()
  51. h.Handler = handler
  52. }