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.

135 lines
3.7 KiB

package logger
import (
"fmt"
"go.uber.org/zap"
"os"
"time"
)
import "go.uber.org/zap/zapcore"
var Logger *zap.SugaredLogger
const (
logTmFmt = "2006-01-02 15:04:05"
)
func init() {
//coreConfig := zapcore.EncoderConfig{
// TimeKey: "ts",
// LevelKey: "level",
// NameKey: "logger",
// CallerKey: "caller",
// FunctionKey: zapcore.OmitKey,
// MessageKey: "msg",
// StacktraceKey: "stacktrace",
// LineEnding: zapcore.DefaultLineEnding, // 默认换行符"\n"
// EncodeLevel: zapcore.CapitalColorLevelEncoder,
// EncodeTime: zapcore.RFC3339TimeEncoder, // 日志时间格式显示
// EncodeDuration: zapcore.MillisDurationEncoder, // 时间序列化,Duration为经过的浮点秒数
// EncodeCaller: zapcore.ShortCallerEncoder, // 日志行号显示
//}
//
//encoder := zapcore.NewConsoleEncoder(coreConfig)
//
//newCore := zapcore.NewCore(encoder, zapcore.AddSync(os.Stdout), zapcore.DebugLevel)
//
//logger := zap.New(newCore)
//
//Logger = logger.Sugar()
GetLogger()
//log, err := zap.NewDevelopment()
//if err != nil {
// panic("log utils init failed")
//}
// TODO: more zap logger configure
// TODO: reserve raw logger handle
//Logger = log.Sugar()
}
func GetLogger() {
config := zapcore.EncoderConfig{
MessageKey: "M",
LevelKey: "L",
TimeKey: "T",
NameKey: "N",
CallerKey: "C",
FunctionKey: "F",
StacktraceKey: "S",
SkipLineEnding: false,
LineEnding: "\n",
EncodeLevel: logEncodeLevel,
//EncodeLevel: zapcore.CapitalColorLevelEncoder,
EncodeTime: logEncodeTime,
EncodeDuration: zapcore.StringDurationEncoder,
//EncodeCaller: logEncodeCaller,
EncodeCaller: zapcore.ShortCallerEncoder,
//EncodeName: logEncodeName,
ConsoleSeparator: " ",
}
//var zc = zap.Config{
// Level: zap.NewAtomicLevelAt(zapcore.DebugLevel),
// Development: false,
// DisableCaller: false,
// DisableStacktrace: false,
// Sampling: nil,
// Encoding: "json",
// EncoderConfig: config,
// OutputPaths: []string{"stdout"},
// ErrorOutputPaths: []string{"stderr"},
// InitialFields: map[string]interface{}{"app": "zapdex"},
//}
newCore := zapcore.NewCore(zapcore.NewConsoleEncoder(config), zapcore.Lock(os.Stderr), zapcore.DebugLevel)
//newCore := zapcore.NewCore(zapcore.NewJSONEncoder(config), zapcore.Lock(os.Stderr), zapcore.DebugLevel)
logger := zap.New(newCore, zap.AddCaller())
//logger := zap.New(newCore)
//logger, _ := zc.Build()
//logger.Named("123")
//fmt.Println(logger.Name())
zap.ReplaceGlobals(logger)
Logger = logger.Sugar()
}
func logEncodeLevel(level zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(func(level zapcore.Level) string {
levelStr := level.CapitalString()
// TODO: using shell codes map
switch level {
case zapcore.DebugLevel:
return fmt.Sprintf("\x1b[39m[%s]\x1b[0m", levelStr)
case zapcore.InfoLevel:
return fmt.Sprintf("\x1b[32m[%s]\x1b[0m", levelStr)
case zapcore.WarnLevel:
return fmt.Sprintf("\x1b[33m[%s]\x1b[0m", levelStr)
case zapcore.ErrorLevel:
return fmt.Sprintf("\x1b[31m[%s]\x1b[0m", levelStr)
case zapcore.PanicLevel:
return fmt.Sprintf("\x1b[95m[%s]\x1b[0m", levelStr)
default:
return fmt.Sprintf("[%s]", levelStr)
}
}(level))
}
func logEncodeTime(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
// TODO: using `2006-01-02 15:04:05.xxx` format
enc.AppendString(fmt.Sprintf(
"\x1b[36m%s\x1b[0m \x1b[90m%s\x1b[0m",
"[XProxy]", t.Format("2006-01-02 15:04:05"),
))
}
func logEncodeCaller(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString("{" + caller.TrimmedPath() + "}")
}