mirror of https://github.com/v2ray/v2ray-core
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.2 KiB
66 lines
1.2 KiB
package log // import "v2ray.com/core/common/log" |
|
|
|
import ( |
|
"sync" |
|
|
|
"v2ray.com/core/common/serial" |
|
) |
|
|
|
// Message is the interface for all log messages. |
|
type Message interface { |
|
String() string |
|
} |
|
|
|
// Handler is the interface for log handler. |
|
type Handler interface { |
|
Handle(msg Message) |
|
} |
|
|
|
// GeneralMessage is a general log message that can contain all kind of content. |
|
type GeneralMessage struct { |
|
Severity Severity |
|
Content interface{} |
|
} |
|
|
|
// String implements Message. |
|
func (m *GeneralMessage) String() string { |
|
return serial.Concat("[", m.Severity, "] ", m.Content) |
|
} |
|
|
|
// Record writes a message into log stream. |
|
func Record(msg Message) { |
|
logHandler.Handle(msg) |
|
} |
|
|
|
var ( |
|
logHandler syncHandler |
|
) |
|
|
|
// RegisterHandler register a new handler as current log handler. Previous registered handler will be discarded. |
|
func RegisterHandler(handler Handler) { |
|
if handler == nil { |
|
panic("Log handler is nil") |
|
} |
|
logHandler.Set(handler) |
|
} |
|
|
|
type syncHandler struct { |
|
sync.RWMutex |
|
Handler |
|
} |
|
|
|
func (h *syncHandler) Handle(msg Message) { |
|
h.RLock() |
|
defer h.RUnlock() |
|
|
|
if h.Handler != nil { |
|
h.Handler.Handle(msg) |
|
} |
|
} |
|
|
|
func (h *syncHandler) Set(handler Handler) { |
|
h.Lock() |
|
defer h.Unlock() |
|
|
|
h.Handler = handler |
|
}
|
|
|