优化支持自定义logger

This commit is contained in:
boyce
2024-04-26 18:13:41 +08:00
parent 7780947a96
commit 258a6821da
2 changed files with 44 additions and 27 deletions

View File

@@ -22,7 +22,10 @@ var LogSize int64
var LogChannelCap int var LogChannelCap int
var LogPath string var LogPath string
var LogLevel slog.Level = LevelTrace var LogLevel slog.Level = LevelTrace
var gLogger, _ = NewTextLogger(LevelDebug, "", "",true,LogChannelCap) var gLogger, _ = NewTextLogger(LevelDebug, "", "",true,LogChannelCap)
var isSetLogger bool
var memPool = bytespool.NewMemAreaPool() var memPool = bytespool.NewMemAreaPool()
// levels // levels
@@ -37,6 +40,21 @@ const (
LevelFatal = slog.Level(20) LevelFatal = slog.Level(20)
) )
type ILogger interface {
Trace(msg string, args ...any)
Debug(msg string, args ...any)
Info(msg string, args ...any)
Warning(msg string, args ...any)
Error(msg string, args ...any)
Stack(msg string, args ...any)
Dump(msg string, args ...any)
Fatal(msg string, args ...any)
DoSPrintf(level slog.Level,a []interface{})
FormatHeader(buf *Buffer,level slog.Level,calldepth int)
Close()
}
type Logger struct { type Logger struct {
Slogger *slog.Logger Slogger *slog.Logger
@@ -47,7 +65,6 @@ type Logger struct {
type IoWriter struct { type IoWriter struct {
outFile io.Writer // destination for output outFile io.Writer // destination for output
outConsole io.Writer //os.Stdout
writeBytes int64 writeBytes int64
logChannel chan []byte logChannel chan []byte
wg sync.WaitGroup wg sync.WaitGroup
@@ -122,8 +139,8 @@ func (iw *IoWriter) Write(p []byte) (n int, err error){
func (iw *IoWriter) writeIo(p []byte) (n int, err error){ func (iw *IoWriter) writeIo(p []byte) (n int, err error){
n,err = iw.writeFile(p) n,err = iw.writeFile(p)
if iw.outConsole != nil { if OpenConsole {
n,err = iw.outConsole.Write(p) n,err = os.Stdout.Write(p)
} }
return return
@@ -217,17 +234,12 @@ func (iw *IoWriter) swichFile() error{
iw.fileDay = now.Day() iw.fileDay = now.Day()
iw.fileCreateTime = now.Unix() iw.fileCreateTime = now.Unix()
atomic.StoreInt64(&iw.writeBytes,0) atomic.StoreInt64(&iw.writeBytes,0)
if OpenConsole == true {
iw.outConsole = os.Stdout
}
}else{
iw.outConsole = os.Stdout
} }
return nil return nil
} }
func NewTextLogger(level slog.Level,pathName string,filePrefix string,addSource bool,logChannelCap int) (*Logger,error){ func NewTextLogger(level slog.Level,pathName string,filePrefix string,addSource bool,logChannelCap int) (ILogger,error){
var logger Logger var logger Logger
logger.ioWriter.filePath = pathName logger.ioWriter.filePath = pathName
logger.ioWriter.fileprefix = filePrefix logger.ioWriter.fileprefix = filePrefix
@@ -242,7 +254,7 @@ func NewTextLogger(level slog.Level,pathName string,filePrefix string,addSource
return &logger,nil return &logger,nil
} }
func NewJsonLogger(level slog.Level,pathName string,filePrefix string,addSource bool,logChannelCap int) (*Logger,error){ func NewJsonLogger(level slog.Level,pathName string,filePrefix string,addSource bool,logChannelCap int) (ILogger,error){
var logger Logger var logger Logger
logger.ioWriter.filePath = pathName logger.ioWriter.filePath = pathName
logger.ioWriter.fileprefix = filePrefix logger.ioWriter.fileprefix = filePrefix
@@ -296,13 +308,18 @@ func (logger *Logger) Fatal(msg string, args ...any) {
os.Exit(1) os.Exit(1)
} }
// It's dangerous to call the method on logging // It's non-thread-safe
func Export(logger *Logger) { func SetLogger(logger ILogger) {
if logger != nil { if logger != nil && isSetLogger == false {
gLogger = logger gLogger = logger
isSetLogger = true
} }
} }
func GetLogger() ILogger{
return gLogger
}
func Trace(msg string, args ...any){ func Trace(msg string, args ...any){
gLogger.Trace(msg, args...) gLogger.Trace(msg, args...)
} }
@@ -415,7 +432,7 @@ func Group(key string, args ...any) slog.Attr {
return slog.Group(key, args...) return slog.Group(key, args...)
} }
func (logger *Logger) doSPrintf(level slog.Level,a []interface{}) { func (logger *Logger) DoSPrintf(level slog.Level,a []interface{}) {
if logger.Slogger.Enabled(context.Background(),level) == false{ if logger.Slogger.Enabled(context.Background(),level) == false{
return return
} }
@@ -425,7 +442,7 @@ func (logger *Logger) doSPrintf(level slog.Level,a []interface{}) {
logger.sBuff.Reset() logger.sBuff.Reset()
logger.formatHeader(&logger.sBuff,level,3) logger.FormatHeader(&logger.sBuff,level,3)
for _,s := range a { for _,s := range a {
logger.sBuff.AppendString(slog.AnyValue(s).String()) logger.sBuff.AppendString(slog.AnyValue(s).String())
@@ -435,46 +452,46 @@ func (logger *Logger) doSPrintf(level slog.Level,a []interface{}) {
} }
func (logger *Logger) STrace(a ...interface{}) { func (logger *Logger) STrace(a ...interface{}) {
logger.doSPrintf(LevelTrace,a) logger.DoSPrintf(LevelTrace,a)
} }
func (logger *Logger) SDebug(a ...interface{}) { func (logger *Logger) SDebug(a ...interface{}) {
logger.doSPrintf(LevelDebug,a) logger.DoSPrintf(LevelDebug,a)
} }
func (logger *Logger) SInfo(a ...interface{}) { func (logger *Logger) SInfo(a ...interface{}) {
logger.doSPrintf(LevelInfo,a) logger.DoSPrintf(LevelInfo,a)
} }
func (logger *Logger) SWarning(a ...interface{}) { func (logger *Logger) SWarning(a ...interface{}) {
logger.doSPrintf(LevelWarning,a) logger.DoSPrintf(LevelWarning,a)
} }
func (logger *Logger) SError(a ...interface{}) { func (logger *Logger) SError(a ...interface{}) {
logger.doSPrintf(LevelError,a) logger.DoSPrintf(LevelError,a)
} }
func STrace(a ...interface{}) { func STrace(a ...interface{}) {
gLogger.doSPrintf(LevelTrace,a) gLogger.DoSPrintf(LevelTrace,a)
} }
func SDebug(a ...interface{}) { func SDebug(a ...interface{}) {
gLogger.doSPrintf(LevelDebug,a) gLogger.DoSPrintf(LevelDebug,a)
} }
func SInfo(a ...interface{}) { func SInfo(a ...interface{}) {
gLogger.doSPrintf(LevelInfo,a) gLogger.DoSPrintf(LevelInfo,a)
} }
func SWarning(a ...interface{}) { func SWarning(a ...interface{}) {
gLogger.doSPrintf(LevelWarning,a) gLogger.DoSPrintf(LevelWarning,a)
} }
func SError(a ...interface{}) { func SError(a ...interface{}) {
gLogger.doSPrintf(LevelError,a) gLogger.DoSPrintf(LevelError,a)
} }
func (logger *Logger) formatHeader(buf *Buffer,level slog.Level,calldepth int) { func (logger *Logger) FormatHeader(buf *Buffer,level slog.Level,calldepth int) {
t := time.Now() t := time.Now()
var file string var file string
var line int var line int

View File

@@ -200,7 +200,7 @@ func initLog() error {
fmt.Printf("cannot create log file!\n") fmt.Printf("cannot create log file!\n")
return err return err
} }
log.Export(logger) log.SetLogger(logger)
return nil return nil
} }