|
|
|
package logger
|
|
|
|
|
|
|
|
import (
|
|
|
|
"go.uber.org/zap"
|
|
|
|
"go.uber.org/zap/zapcore"
|
|
|
|
"os"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Logger struct {
|
|
|
|
logger *zap.Logger
|
|
|
|
level *zap.AtomicLevel
|
|
|
|
sugar *zap.SugaredLogger
|
|
|
|
writers []zapcore.WriteSyncer
|
|
|
|
stdCore zapcore.Core
|
|
|
|
}
|
|
|
|
|
|
|
|
var handle Logger
|
|
|
|
|
|
|
|
// logConfig generates log config for XProxy.
|
|
|
|
func logConfig(colored bool) zapcore.EncoderConfig {
|
|
|
|
config := zapcore.EncoderConfig{
|
|
|
|
ConsoleSeparator: " ",
|
|
|
|
MessageKey: "msg",
|
|
|
|
LevelKey: "level",
|
|
|
|
TimeKey: "time",
|
|
|
|
CallerKey: "caller",
|
|
|
|
EncodeTime: timeEncoder,
|
|
|
|
EncodeLevel: levelEncoder,
|
|
|
|
EncodeCaller: callerEncoder,
|
|
|
|
}
|
|
|
|
if colored {
|
|
|
|
config.EncodeTime = timeColoredEncoder
|
|
|
|
config.EncodeLevel = levelColoredEncoder
|
|
|
|
config.EncodeCaller = callerColoredEncoder
|
|
|
|
}
|
|
|
|
return config
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
level := zap.NewAtomicLevelAt(DebugLevel)
|
|
|
|
core := zapcore.NewCore(
|
|
|
|
zapcore.NewConsoleEncoder(logConfig(true)),
|
|
|
|
zapcore.Lock(os.Stderr), level,
|
|
|
|
)
|
|
|
|
logger := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
|
|
|
|
handle = Logger{
|
|
|
|
logger: logger,
|
|
|
|
level: &level,
|
|
|
|
sugar: logger.Sugar(),
|
|
|
|
writers: []zapcore.WriteSyncer{},
|
|
|
|
stdCore: core,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// addWrites adds more plain log writers.
|
|
|
|
func addWrites(writers ...zapcore.WriteSyncer) {
|
|
|
|
handle.writers = append(handle.writers, writers...)
|
|
|
|
plainCore := zapcore.NewCore(
|
|
|
|
zapcore.NewConsoleEncoder(logConfig(false)),
|
|
|
|
zap.CombineWriteSyncers(handle.writers...),
|
|
|
|
handle.level,
|
|
|
|
)
|
|
|
|
handle.logger = zap.New(
|
|
|
|
zapcore.NewTee(handle.stdCore, plainCore),
|
|
|
|
zap.AddCaller(), zap.AddCallerSkip(1),
|
|
|
|
)
|
|
|
|
handle.sugar = handle.logger.Sugar()
|
|
|
|
}
|