Files
vRp.CD2g_test/utils/log/v2/logger.go
2024-04-02 19:22:39 +08:00

94 lines
2.2 KiB
Go

package log
import (
"log/slog"
"os"
"sync/atomic"
)
var logger = func() *atomic.Pointer[Logger] {
var p atomic.Pointer[Logger]
p.Store(slog.New(NewHandler(os.Stdout)))
return &p
}()
// NewLogger 创建一个新的日志记录器
func NewLogger(handler Handler) *Logger {
return slog.New(handler)
}
// NewDefaultLogger 创建一个新的默认日志记录器
func NewDefaultLogger() *Logger {
return NewLogger(NewHandler(os.Stdout))
}
// GetLogger 并发安全的获取当前全局日志记录器
func GetLogger() *Logger {
l := logger.Load()
if h := cloneHandler(l.Handler()); h != nil {
return NewLogger(h)
}
return l
}
// SetLogger 并发安全的设置全局日志记录器
func SetLogger(l *Logger) {
logger.Store(l)
}
// ResetLogger 并发安全的重置全局日志记录器
func ResetLogger() {
logger.Store(slog.New(NewHandler(os.Stdout)))
}
// Debug 使用全局日志记录器在 LevelDebug 级别下记录一条消息
func Debug(msg string, args ...any) {
logger.Load().Debug(msg, args...)
}
// Info 使用全局日志记录器在 LevelInfo 级别下记录一条消息
func Info(msg string, args ...any) {
logger.Load().Info(msg, args...)
}
// Warn 使用全局日志记录器在 LevelWarn 级别下记录一条消息
func Warn(msg string, args ...any) {
logger.Load().Warn(msg, args...)
}
// Error 使用全局日志记录器在 LevelError 级别下记录一条消息
func Error(msg string, args ...any) {
logger.Load().Error(msg, args...)
}
// Log 按照指定级别记录日志消息
func Log(level Level, msg string, args ...any) {
switch level {
case LevelDebug:
logger.Load().Debug(msg, args...)
case LevelInfo:
logger.Load().Info(msg, args...)
case LevelWarn:
logger.Load().Warn(msg, args...)
case LevelError:
logger.Load().Error(msg, args...)
default:
}
}
func cloneHandler(h Handler) Handler {
switch h := h.(type) {
case *MinotaurHandler:
cloneHandler := h.clone()
cloneHandler.GetOptions().WithCallerSkip(-1)
return cloneHandler
case *MultiHandler:
var handlers = make([]Handler, 0, len(h.handlers))
for _, handler := range h.handlers {
handlers = append(handlers, cloneHandler(handler))
}
return NewMultiHandler(handlers...)
}
return nil
}