/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package getty import ( "go.uber.org/zap" "go.uber.org/zap/zapcore" ) // Logger for user who want to customize logger of getty type Logger interface { Info(args ...interface{}) Warn(args ...interface{}) Error(args ...interface{}) Debug(args ...interface{}) Infof(fmt string, args ...interface{}) Warnf(fmt string, args ...interface{}) Errorf(fmt string, args ...interface{}) Debugf(fmt string, args ...interface{}) } type LoggerLevel int8 const ( // LoggerLevelDebug DebugLevel logs are typically voluminous, and are usually disabled in // production. LoggerLevelDebug = LoggerLevel(zapcore.DebugLevel) // LoggerLevelInfo InfoLevel is the default logging priority. LoggerLevelInfo = LoggerLevel(zapcore.InfoLevel) // LoggerLevelWarn WarnLevel logs are more important than Infof, but don't need individual // human review. LoggerLevelWarn = LoggerLevel(zapcore.WarnLevel) // LoggerLevelError ErrorLevel logs are high-priority. If an application is running smoothly, // it shouldn't generate any error-level logs. LoggerLevelError = LoggerLevel(zapcore.ErrorLevel) // LoggerLevelDPanic DPanicLevel logs are particularly important errors. In development the // logger panics after writing the message. LoggerLevelDPanic = LoggerLevel(zapcore.DPanicLevel) // LoggerLevelPanic PanicLevel logs a message, then panics. LoggerLevelPanic = LoggerLevel(zapcore.PanicLevel) // LoggerLevelFatal FatalLevel logs a message, then calls os.Exit(1). LoggerLevelFatal = LoggerLevel(zapcore.FatalLevel) ) var ( log Logger zapLogger *zap.Logger zapLoggerConfig = zap.NewDevelopmentConfig() zapLoggerEncoderConfig = zapcore.EncoderConfig{ TimeKey: "time", LevelKey: "level", NameKey: "logger", CallerKey: "caller", MessageKey: "message", StacktraceKey: "stacktrace", EncodeLevel: zapcore.CapitalColorLevelEncoder, EncodeTime: zapcore.ISO8601TimeEncoder, EncodeDuration: zapcore.SecondsDurationEncoder, EncodeCaller: zapcore.ShortCallerEncoder, } ) func init() { zapLoggerConfig.EncoderConfig = zapLoggerEncoderConfig zapLogger, _ = zapLoggerConfig.Build() log = zapLogger.Sugar() // todo: flushes buffer when redirect log to file. // var exitSignal = make(chan os.Signal) // signal.Notify(exitSignal, syscall.SIGTERM, syscall.SIGINT) // go func() { // <-exitSignal // // Sync calls the underlying Core's Sync method, flushing any buffered log // // entries. Applications should take care to call Sync before exiting. // err := zapLogger.Sync() // flushes buffer, if any // if err != nil { // fmt.Printf("zapLogger sync err: %+v", perrors.WithStack(err)) // } // os.Exit(0) // }() } // SetLogger customize yourself logger. func SetLogger(logger Logger) { log = logger } // GetLogger get getty logger func GetLogger() Logger { return log } // SetLoggerLevel set logger level func SetLoggerLevel(level LoggerLevel) error { var err error zapLoggerConfig.Level = zap.NewAtomicLevelAt(zapcore.Level(level)) zapLogger, err = zapLoggerConfig.Build() if err != nil { return err } log = zapLogger.Sugar() return nil } // SetLoggerCallerDisable disable caller info in production env for performance improve. // It is highly recommended that you execute this method in a production environment. func SetLoggerCallerDisable() error { var err error zapLoggerConfig.Development = false zapLoggerConfig.DisableCaller = true zapLogger, err = zapLoggerConfig.Build() if err != nil { return err } log = zapLogger.Sugar() return nil }