log.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package log
  2. import (
  3. "sync/atomic"
  4. "unsafe"
  5. "v2ray.com/core/common/serial"
  6. )
  7. // Message is the interface for all log messages.
  8. type Message interface {
  9. String() string
  10. }
  11. // Handler is the interface for log handler.
  12. type Handler interface {
  13. Handle(msg Message)
  14. }
  15. type noOpHandler byte
  16. func (noOpHandler) Handle(msg Message) {}
  17. // GeneralMessage is a general log message that can contain all kind of content.
  18. type GeneralMessage struct {
  19. Severity Severity
  20. Content interface{}
  21. }
  22. // String implements Message.
  23. func (m *GeneralMessage) String() string {
  24. return serial.Concat("[", m.Severity, "]: ", m.Content)
  25. }
  26. func (s Severity) SevererThan(another Severity) bool {
  27. return s <= another
  28. }
  29. // Record writes a message into log stream.
  30. func Record(msg Message) {
  31. h := (*Handler)(atomic.LoadPointer(&logHandler))
  32. (*h).Handle(msg)
  33. }
  34. var (
  35. logHandler unsafe.Pointer
  36. )
  37. // RegisterHandler register a new handler as current log handler. Previous registered handler will be discarded.
  38. func RegisterHandler(handler Handler) {
  39. if handler == nil {
  40. panic("Log handler is nil")
  41. }
  42. atomic.StorePointer(&logHandler, unsafe.Pointer(&handler))
  43. }
  44. func init() {
  45. RegisterHandler(noOpHandler(0))
  46. }