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() + "}") }