• 【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 //可以输出 结构化日志、非结构化日志。 可用于开发的时候方便程序员写日志
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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)
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    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, //是否压缩
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    2.5 测试

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

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

    注意:本项目暂时搁置了

  • 相关阅读:
    Qt 绘画
    地铁车辆基础制动装置设计
    Service & Endpoint
    【多线程初阶】多线程案例之线程池
    在任何机器人上实施 ROS 导航堆栈的指南
    【C++杂货铺】会杂耍的二叉搜索树——AVLTree
    酷炫效果 进度条
    C语言之字符串函数二
    stm32cubemx hal学习记录:TIMER输入捕获
    同一个页面同一区域两个el-table在v-if下样式重叠问题
  • 原文地址:https://blog.csdn.net/weixin_45919793/article/details/126304108