【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 测试

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

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

注意:本项目暂时搁置了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 go-mysql 库进行与数据库同步时,可以通过设置 `MaxAllowedPacket` 参数来控制超时时间。`MaxAllowedPacket` 参数定义了客户端与服务器之间可以传输的最大数据包大小,如果数据包超过这个大小,连接将会被终止。 以下是设置 `MaxAllowedPacket` 参数的示例代码: ```go import ( "database/sql" "fmt" "time" "github.com/go-sql-driver/mysql" ) func main() { // 创建 MySQL 连接配置 cfg := mysql.Config{ User: "username", Passwd: "password", Net: "tcp", Addr: "localhost:3306", DBName: "database_name", Timeout: 3 * time.Second, // 设置连接超时时间 MaxAllowedPacket: 32 * 1024 * 1024, // 设置最大允许的数据包大小 ReadTimeout: 3 * time.Second, // 设置读取超时时间 WriteTimeout: 3 * time.Second, // 设置写入超时时间 AllowNativePasswords: true, } // 创建 MySQL 数据库连接 db, err := sql.Open("mysql", cfg.FormatDSN()) if err != nil { fmt.Println("Failed to connect to MySQL:", err) return } defer db.Close() // 进行数据库操作... } ``` 在上述示例中,我们使用 `mysql.Config` 结构来设置连接配置,其中包括了 `Timeout`、`MaxAllowedPacket`、`ReadTimeout` 和 `WriteTimeout` 参数。你可以根据你的需求来调整这些参数的值。请注意,`Timeout` 参数设置的是连接超时时间,`ReadTimeout` 和 `WriteTimeout` 参数分别设置的是读取和写入操作的超时时间。 通过以上设置,你可以根据需求来控制与数据库同步的超时时间。希望这个示例能对你有所帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值