|
|
|
package logger
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"fmt"
|
|
|
|
"github.com/gookit/color"
|
|
|
|
"go.uber.org/zap/zapcore"
|
|
|
|
"runtime"
|
|
|
|
"strconv"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
// getGID get goroutine ID only for debugging.
|
|
|
|
// -> https://blog.sgmansfield.com/2015/12/goroutine-ids/
|
|
|
|
func getGID() uint64 {
|
|
|
|
b := make([]byte, 64)
|
|
|
|
b = b[:runtime.Stack(b, false)]
|
|
|
|
b = bytes.TrimPrefix(b, []byte("goroutine "))
|
|
|
|
b = b[:bytes.IndexByte(b, ' ')]
|
|
|
|
n, _ := strconv.ParseUint(string(b), 10, 64)
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
|
|
|
// timeEncoder formats the time as a string.
|
|
|
|
func timeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
|
|
|
|
enc.AppendString(t.Format("2006-01-02 15:04:05.000"))
|
|
|
|
}
|
|
|
|
|
|
|
|
// timeColoredEncoder formats the time as a colored string
|
|
|
|
// with `[XProxy]` prefix.
|
|
|
|
func timeColoredEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
|
|
|
|
enc.AppendString(fmt.Sprintf(
|
|
|
|
"%s %s",
|
|
|
|
color.Cyan.Render("[XProxy]"),
|
|
|
|
color.Gray.Render(t.Format("2006-01-02 15:04:05.000")),
|
|
|
|
))
|
|
|
|
}
|
|
|
|
|
|
|
|
// callerEncoder formats caller in square brackets.
|
|
|
|
func callerEncoder(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) {
|
|
|
|
if !handle.gid {
|
|
|
|
enc.AppendString("[" + caller.TrimmedPath() + "]")
|
|
|
|
} else {
|
|
|
|
enc.AppendString(fmt.Sprintf("[%s] [%d]", caller.TrimmedPath(), getGID()))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// callerColoredEncoder formats caller in square brackets
|
|
|
|
// with magenta color.
|
|
|
|
func callerColoredEncoder(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) {
|
|
|
|
if !handle.gid {
|
|
|
|
enc.AppendString(color.Magenta.Render("[" + caller.TrimmedPath() + "]"))
|
|
|
|
return
|
|
|
|
}
|
|
|
|
enc.AppendString(fmt.Sprintf(
|
|
|
|
"%s %s",
|
|
|
|
color.Magenta.Render("["+caller.TrimmedPath()+"]"),
|
|
|
|
color.Blue.Render(fmt.Sprintf("[%d]", getGID())),
|
|
|
|
))
|
|
|
|
}
|
|
|
|
|
|
|
|
// levelEncoder formats log level using square brackets.
|
|
|
|
func levelEncoder(level zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
|
|
|
|
enc.AppendString("[" + level.CapitalString() + "]")
|
|
|
|
}
|
|
|
|
|
|
|
|
// levelColoredEncoder formats log level using square brackets
|
|
|
|
// and uses different colors.
|
|
|
|
func levelColoredEncoder(level zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
|
|
|
|
levelStr := "[" + level.CapitalString() + "]"
|
|
|
|
switch level {
|
|
|
|
case zapcore.DebugLevel:
|
|
|
|
levelStr = color.FgDefault.Render(levelStr)
|
|
|
|
case zapcore.InfoLevel:
|
|
|
|
levelStr = color.Green.Render(levelStr)
|
|
|
|
case zapcore.WarnLevel:
|
|
|
|
levelStr = color.Yellow.Render(levelStr)
|
|
|
|
case zapcore.ErrorLevel:
|
|
|
|
levelStr = color.Red.Render(levelStr)
|
|
|
|
case zapcore.PanicLevel:
|
|
|
|
levelStr = color.LightRed.Render(levelStr)
|
|
|
|
}
|
|
|
|
enc.AppendString(levelStr)
|
|
|
|
}
|