基于douyu的xlog
依赖
github.com/douyu/jupiter/pkg/xlog
go.uber.org/zap
gopkg.in/natefinch/lumberjack.v2
log相关结构体
types/log.go
type Log struct {Env string `toml:"env"`InfoLogFileName string `toml:"infoLogFileName"`ErrorLogFileName string `toml:"errorLogFileName"`MaxSize uint32 `toml:"maxSize"`MaxBackups uint32 `toml:"maxBackups"`MaxAge uint32 `toml:"maxAge"`Dir string `toml:"dir"`Level string `toml:"level"`
}
配置文件
config/config.toml
[log]
env = "dev"
infoLogFileName = "info.log"
errorLogFileName = "error.log"
maxSize = 50
maxBackups = 20
maxAge = 7
dir = "./logs/"
level = "info"
解析toml配置文件
config/config.go
package configimport ("your-system/types""github.com/BurntSushi/toml"
)var Conf Config// Config 定义一个结构体接收toml所有配置
type Config struct {Log types.Log
}func ConfParse() {configPath := "./config/config.toml"if _, err := toml.DecodeFile(configPath, &Conf); err != nil {xlog.Error("get conf failed", xlog.Any("err", err))panic(err)}
}
xlog 初始化
log/log.go
package logimport ("fmt""os""your-system/types""strings""time""github.com/douyu/jupiter/pkg/xlog""go.uber.org/zap""go.uber.org/zap/zapcore""gopkg.in/natefinch/lumberjack.v2"
)
func InitLogger(log *types.Log) {// 获取 info、error日志文件的io.Writer 抽象 getFileLogWriter() 在下方实现infoWriteSyncer := getLogWriter(log, log.InfoLogFileName)errorWriteSyncer := getLogWriter(log, log.ErrorLogFileName)encoder := getEncoder()level := getLevel(log.Level)// 初始化 cores 切片var cores []zapcore.Core// 如果不是生产环境,添加控制台输出fmt.Println(strings.ToLower(log.Env))if strings.ToLower(log.Env) != "prd" {cores = append(cores,zapcore.NewCore(encoder, zapcore.AddSync(os.Stdout), zapcore.DebugLevel), // 打印到控制台)}cores = append(cores,// 向文件写日志, 生产环境不往控制台输出,生产环境记得改成Infozapcore.NewCore(encoder, zapcore.AddSync(infoWriteSyncer), level),zapcore.NewCore(encoder, zapcore.AddSync(errorWriteSyncer), zapcore.ErrorLevel),)core := zapcore.NewTee(cores...)logger := zap.New(core, zap.AddCaller())xlog.SetDefault(logger)
}func getLogWriter(log *types.Log, logFileName string) zapcore.WriteSyncer {lumberJackLogger := &lumberjack.Logger{Filename: fmt.Sprintf("%s%s", log.Dir, logFileName),MaxSize: int(log.MaxSize),MaxBackups: int(log.MaxBackups),MaxAge: int(log.MaxAge),LocalTime: true,Compress: false, //是否压缩/归档旧文件}syncFile := zapcore.AddSync(lumberJackLogger) // 打印到文件return zapcore.NewMultiWriteSyncer(syncFile)
}// 负责设置 encoding 的日志格式
func getEncoder() zapcore.Encoder {encoderConfig := zap.NewProductionEncoderConfig()// 序列化时间。eg: 2006-01-02 15:04:05.00encoderConfig.EncodeTime = cEncodeTimeencoderConfig.TimeKey = "time"encoderConfig.EncodeDuration = zapcore.SecondsDurationEncoder// 将Level序列化为全大写字符串。例如,将info level序列化为INFO。encoderConfig.EncodeLevel = cEncodeLevel// 以 package/file:行 的格式 序列化调用程序,从完整路径中删除除最后一个目录外的所有目录。encoderConfig.EncodeCaller = cEncodeCallerreturn zapcore.NewConsoleEncoder(encoderConfig)
}// cEncodeLevel 自定义日志级别显示
func cEncodeLevel(level zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {zapcore.CapitalLevelEncoder(level, enc)
}// cEncodeTime 自定义时间格式显示
func cEncodeTime(t time.Time, enc zapcore.PrimitiveArrayEncoder) {enc.AppendString("[" + t.Format("2006-01-02 15:04:05.000") + "]")
}// cEncodeCaller 自定义行号显示
func cEncodeCaller(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) {enc.AppendString("[" + caller.TrimmedPath() + "]")
}func getLevel(level string) zapcore.Level {switch strings.ToLower(level) {case "debug":return zapcore.DebugLevelcase "info":return zapcore.InfoLevelcase "warn":return zapcore.WarnLevelcase "error":return zapcore.ErrorLevelcase "panic":return zapcore.PanicLevelcase "fata":return zapcore.FatalLeveldefault:return zapcore.DebugLevel}
}
主入口文件
main.go
package mainimport ("your-system/config""strings""time""github.com/douyu/jupiter/pkg/xlog"
)
func main(){config.ConfParse()log.InitLogger(&config.Conf.Log)object := xlog.Error("ErrorMsg ", xlog.Any("object", config.Conf.Log), xlog.String("string", "123123"))
}
在其他地方使用的时候,只需要 import “github.com/douyu/jupiter/pkg/xlog”,使用类似 xlog.Error("ErrorMsg ", xlog.Any(“object”, config.Conf.Log), xlog.String(“string”, “123123”)) 语法即可