项目地址:https://gitee.com/illlloooovvvvcode/daily-blog
var (
GVA_CONFIG conf.Conf
GVA_DB *gorm.DB
GVA_LOG *zap.Logger //只能输出结构化日志,但是性能要高于 SugaredLogger
GVA_LOG_DEV *zap.SugaredLogger //可以输出 结构化日志、非结构化日志。 可用于开发的时候方便程序员写日志
)
func InitDB() {
var err error
confDB := GVA_CONFIG.DB // 获取配置
// 构建dns
dns := confDB.User + ":" + confDB.Pwd +
"@tcp(" + confDB.Host + confDB.Port + ")/" +
confDB.Name + "?charset=utf8mb4&parseTime=True&loc=Local"
log.Printf("dns: %v\n", dns)
//配置 db logger
newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注)
logger.Config{
SlowThreshold: time.Second, // 慢 SQL 阈值
LogLevel: logger.Silent, // 日志级别
IgnoreRecordNotFoundError: false, // 忽略ErrRecordNotFound(记录未找到)错误
Colorful: true, // 禁用彩色打印
},
)
// 初始化DB对象
if GVA_DB, err = gorm.Open(mysql.Open(dns), &gorm.Config{
SkipDefaultTransaction: true, // 跳过单条语句的事务处理
Logger: newLogger,
DisableForeignKeyConstraintWhenMigrating: true, // 禁用创建外键约束
NamingStrategy: schema.NamingStrategy{
SingularTable: true, // 禁用表名加s
},
}); err != nil {
log.Panic("数据库初始化失败", err)
}
}
// 初始化日志 logger
func InitLog() {
var logLevel zapcore.Level
logLevel = zapcore.Level(GVA_CONFIG.Log.Level)
config := zapcore.EncoderConfig{
MessageKey: "msg", //结构化(json)输出:msg的key
LevelKey: "level", //结构化(json)输出:日志级别的key(INFO,WARN,ERROR等)
TimeKey: "ts", //结构化(json)输出:时间的key(INFO,WARN,ERROR等)
CallerKey: "file", //结构化(json)输出:打印日志的文件对应的Key
EncodeLevel: zapcore.CapitalLevelEncoder, //将日志级别转换成大写(INFO,WARN,ERROR等)
EncodeCaller: zapcore.ShortCallerEncoder, //采用短文件路径编码输出(test/main.go:14 )
EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(t.Format("2006-01-02 15:04:05"))
}, //输出的时间格式
}
//自定义日志级别:自定义Info级别
infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl < zapcore.WarnLevel && lvl >= logLevel
})
//自定义日志级别:自定义Warn级别
warnLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zapcore.WarnLevel && lvl >= logLevel
})
// 获取io.Writer的实现
infoWriter := getWriter(GVA_CONFIG.Log.FileName + "_info")
warnWriter := getWriter(GVA_CONFIG.Log.FileName + "_error")
// 实现多个输出
core := zapcore.NewTee(
zapcore.NewCore(zapcore.NewConsoleEncoder(config), zapcore.AddSync(infoWriter), infoLevel), //将info及以下写入logPath,NewConsoleEncoder 是非结构化输出
zapcore.NewCore(zapcore.NewConsoleEncoder(config), zapcore.AddSync(warnWriter), warnLevel), //warn及以上写入errPath
zapcore.NewCore(zapcore.NewConsoleEncoder(config), zapcore.AddSync(zapcore.AddSync(os.Stdout)), logLevel), //同时将日志输出到控制台,NewJSONEncoder 是结构化输出
)
GVA_LOG = zap.New(core, zap.AddCaller(), zap.AddStacktrace(zap.WarnLevel))
GVA_LOG_DEV = GVA_LOG.Sugar()
}
func getWriter(filename string) io.Writer {
logConf := GVA_CONFIG.Log
return &lumberjack.Logger{
Filename: filename, // 日志文件位置
MaxSize: logConf.MaxSize, //最大M数,超过则切割
MaxBackups: logConf.MaxSize, //最大文件保留数,超过就删除最老的日志文件
MaxAge: logConf.MaxAge, //保存30天
Compress: logConf.Compress, //是否压缩
}
}
测试自动迁移表
创建成功,代表数据库初始化成功
测试日志打印
全部打印成功
注意:本项目暂时搁置了