| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 | package logimport (	"sync/atomic"	"unsafe"	"v2ray.com/core/common/serial")type Message interface {	String() string}type Handler interface {	Handle(msg Message)}type noOpHandler bytefunc (noOpHandler) Handle(msg Message) {}type GeneralMessage struct {	Severity Severity	Content  interface{}}func (m *GeneralMessage) String() string {	return serial.Concat("[", m.Severity, "]: ", m.Content)}func Record(msg Message) {	h := (*Handler)(atomic.LoadPointer(&logHandler))	(*h).Handle(msg)}var (	logHandler unsafe.Pointer)func RegisterHandler(handler Handler) {	if handler == nil {		panic("Log handler is nil")	}	atomic.StorePointer(&logHandler, unsafe.Pointer(&handler))}func init() {	RegisterHandler(noOpHandler(0))}
 |