2 初始化数据库和日志
项目地址:https://gitee.com/illlloooovvvvcode/daily-blog
2.1各种配置的目录结构
2.2 待初始的全局对象
- global.go 存储全局对象
var (GVA_CONFIG conf.ConfGVA_DB *gorm.DBGVA_LOG *zap.Logger //只能输出结构化日志,但是性能要高于 SugaredLoggerGVA_LOG_DEV *zap.SugaredLogger //可以输出 结构化日志、非结构化日志。 可用于开发的时候方便程序员写日志
)
2.3 初始化数据库对象
- init-db.go
func InitDB() {var err errorconfDB := GVA_CONFIG.DB // 获取配置// 构建dnsdns := confDB.User + ":" + confDB.Pwd +"@tcp(" + confDB.Host + confDB.Port + ")/" +confDB.Name + "?charset=utf8mb4&parseTime=True&loc=Local"log.Printf("dns: %v\n", dns)//配置 db loggernewLogger := 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)}
}
2.4 初始化日志对象
- init-log.go
// 初始化日志 logger
func InitLog() {var logLevel zapcore.LevellogLevel = zapcore.Level(GVA_CONFIG.Log.Level)config := zapcore.EncoderConfig{MessageKey: "msg", //结构化(json)输出:msg的keyLevelKey: "level", //结构化(json)输出:日志级别的key(INFO,WARN,ERROR等)TimeKey: "ts", //结构化(json)输出:时间的key(INFO,WARN,ERROR等)CallerKey: "file", //结构化(json)输出:打印日志的文件对应的KeyEncodeLevel: 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及以上写入errPathzapcore.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.Logreturn &lumberjack.Logger{Filename: filename, // 日志文件位置MaxSize: logConf.MaxSize, //最大M数,超过则切割MaxBackups: logConf.MaxSize, //最大文件保留数,超过就删除最老的日志文件MaxAge: logConf.MaxAge, //保存30天Compress: logConf.Compress, //是否压缩}
}
2.5 测试
测试自动迁移表
创建成功,代表数据库初始化成功
测试日志打印
全部打印成功
注意:本项目暂时搁置了