【GoWeb项目-个人Blog】初始化数据库和日志

2 初始化数据库和日志

项目地址:https://gitee.com/illlloooovvvvcode/daily-blog

2.1各种配置的目录结构

在这里插入图片描述

2.2 待初始的全局对象

  • global.go 存储全局对象
var (
	GVA_CONFIG  conf.Conf
	GVA_DB      *gorm.DB
	GVA_LOG     *zap.Logger        //只能输出结构化日志,但是性能要高于 SugaredLogger
	GVA_LOG_DEV *zap.SugaredLogger //可以输出 结构化日志、非结构化日志。 可用于开发的时候方便程序员写日志
)

2.3 初始化数据库对象

  • init-db.go
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)
	}
}

2.4 初始化日志对象

  • init-log.go
// 初始化日志 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, //是否压缩
	}
}

2.5 测试

测试自动迁移表
在这里插入图片描述
创建成功,代表数据库初始化成功
在这里插入图片描述

测试日志打印在这里插入图片描述在这里插入图片描述
全部打印成功

注意:本项目暂时搁置了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值