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

article/2025/9/21 12:30:01

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

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

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

注意:本项目暂时搁置了


http://chatgpt.dhexx.cn/article/AKjUUIi0.shtml

相关文章

PyTorch: visdom可视化

一、visdom可视化配置 1、安装visdom库 pip install visdom 2、配置环境 python -m visdom server 3、浏览器打开网址&#xff1a; visdomhttp://localhost:8097/ 二、显示的结果 三、代码 import torch import torch.nn as nn import torch.nn.functional as F impo…

关于小白安装nodejs遇到的问题(npm WARN config global `--global`, `--local` are deprecated. Use `--location=glob)

今天是7.8 问题已经解决啦&#xff01;连滚带爬的来更新了&#xff01; 总结&#xff1a;遇到这个问题有可能是因为自带的node版本过低&#xff01;并且升级win11的好像都会遇到 对我而言的错误方法一&#xff1a; 虽然现在有一个很火的帖子改文档-global成为–locationglob…

46.在ROS中实现global planner(2)- A*规划算法预研

前文45.在ROS中实现global planner&#xff08;1&#xff09;- 实现一个可以用的模板实现了一个global planner的模板&#xff0c;并且可以工作&#xff0c;本文将实现astar算法&#xff0c;为后续完成一个astar global planner做准备 1. AStar简介 1.1 AStar Astar算法是一…

【GlobalMapper精品教程】002:GlobalMapper中文版安装后的基本设置

本文讲述安装globalmapper后的一些简单基本设置&#xff08;持续更新&#xff09;&#xff0c;为后续深入学习软件打下基础。订阅专栏后私信作者&#xff0c;获取中文安装包及配套实验数据包。 文章目录 1. 工具条的显示与关闭2. 面积单位设置3. 选择所选面要素的边框4. 二三维…

nvm + nodejs + vue项目 环境搭建备忘

内容介绍&#xff1a; 传统 JavaScript 传统 JavaScript 运行在浏览器上&#xff0c;浏览器内核分为两个部分&#xff1a; 渲染引擎渲染HTML和CSSJavaScript 引擎 负责运行 JavaScrip…

python3_函数_形参调用方式 / 不定长参数 / 函数返回值 / 变量作用域 / 匿名函数 / 递归调用 / 函数式编程 / 高阶函数 / gobal和nonlocal关键字 / 内置函数

1.形参的调用方式 1. 位置参数调用 2. 关键词参数调用 原则&#xff1a; 关键词参数调用不能写在位置参数调用的前边 def test1(name, age):print("name:", name)print("age:", age)if "__main__" __name__:test1("admin_maxin", age…

关于Vivado综合选项——Out of context per IP和Gobal

Vivado生成IP输出文件注意的地方&#xff0c;是选择Global还是Out of context per IP: vivado默认是第二种&#xff0c;Out of context per IP是指让vivado在综合的时候对IP进行单独综合&#xff0c;生成.dcp文件&#xff0c;然后再工程要用到IP的时候&#xff0c;只需从.dcp文…

Oracle 临时表 (Gobal Temporary Table)

提问&#xff0c;插入数据之后&#xff0c;COMMIT&#xff0c;数据是否一定会在表里呢&#xff1f; 回答 一定会在。我认为没有错 回答 可能会在。也没有错 → 没在就一定是被删了&#xff0c;那么有一种表&#xff0c;会在Commit时&#xff0c;清空所有数据。 刚才说的那种…

转载:关于Vivado综合选项——Out of context per IP和Gobal

转载&#xff1a;关于Vivado综合选项——Out of context per IP和Gobal 原文地址&#xff1a;https://www.cnblogs.com/yhsy1002/p/7441309.html 关于Vivado综合选项——Out of context per IP和Gobal Vivado生成IP输出文件注意的地方&#xff0c;是选择Global还是Out of cont…

An Implemention of Realtime Gobal Illumination

前言&#xff1a;CG画面的“效果”最重要&#xff0c;至于达到这一效果所使用的技术倒是其次&#xff0c;一切的一切对于观众来说都是透明的。即使是Pixar都认为仅仅One Bounce Indirect Illumination对构建一个足够真实可信的光照效果足矣。看过这里的SII&#xff0c;我想你对…

Oracle ORA-06502 ORA-06512

问题描述&#xff1a; 发现存储过程里有对oracle <Collection>类型的操作 sql_text : select a.* from t_Drivewaystatus a inner join t_intersection b on a.intersectioncode b.intersectioncode where b.used 1 order by a.intersectioncode,a.drivewaycode; open…

ora-20011 ora-01555

问题 解决方案 ora undoinfo alter tablespace undotbs1 add datafile size 30g; alter tablespace undotbs2 add datafile size 30g; ora undoinfoora tempfree alter tablespace temp add tempfile size 30g; ora tempfree

ora-01461

插入数据长度大于4000&#xff0c;报该错ora-01461 解决方式&#xff1a;修改字段类型为 clob&#xff0c; 第一步&#xff1a;添加一个clob类型字段 ALTER TABLE tb_a ADD (RYZP CLOB);第二步&#xff1a;删除原来的字段 ALTER TABLE tb_a DROP COLUMN RYZP1;上面只是我工…

ORA-01156

需要关闭mrp进行操作。 alter database recover managed standby database cancel; alter database recover managed standby database parallel 10 using current logfile disconnect from session;

拼接字符串报错:Oracle: ORA-06512:字符串缓冲区太小

报错目前可以肯定的是&#xff0c;拼接的字符串超过oracle定义的上限。 plsql中varchar2长度上限是4000字节 报错语句定位到下面的这句&#xff1a; 我这里的p_zbdcdyh是存储过程的输出参数&#xff0c;故是默认数据库的字符串varchar2的大小。 p_zbdcdyh:p_zbdcdyh||,||PSELEN…

图像传感器设计资料-764-GSPRINT4502 2MP-4.5微米 全局快门 高速 CMOS 图像传感器

GSPRINT4502 2MP-4.5微米 全局快门 高速 CMOS 图像传感器 GSPRINT4502是一款一千万分辨率 (2048 x 1216) &#xff0c;2/3”光学尺寸的高速图像传感器&#xff0c;采用最新的4.5微米电荷域全局快门像素设计&#xff0c;实现30ke-的满阱容量和小于4e-的读出噪声。利用先进的65n…

转:详细图解,一眼就能看懂!卷帘快门(Rolling Shutter)与全局快门(Global Shutter)的区别

什么是快门 快门是照相机用来控制感光片有效曝光时间的机构。是照相机的一个重要组成部分&#xff0c;它的结构、形式及功能是衡量照相机档次的一个重要因素。 什么是Global Shutter&#xff08;Total Shutter&#xff09;&#xff1f; 通过整幅场景在同一时间曝光实现的。Sen…

详细图解,一眼就能看懂!卷帘快门(Rolling Shutter)与全局快门(Global Shutter)的区别

什么是快门 快门是照相机用来控制感光片有效曝光时间的机构。是照相机的一个重要组成部分&#xff0c;它的结构、形式及功能是衡量照相机档次的一个重要因素。 什么是Global Shutter&#xff08;Total Shutter&#xff09;&#xff1f; 通过整幅场景在同一时间曝光实现的。S…

VIO与全局快门及轮速计的一些应用小技巧

封面就用一个可爱的小车车~ 之前各种针对VIO&#xff0c;VSLAM和VINS的工程注意事项都讲过了 今天的内容主要是针对VSLAM&#xff0c;VIO的实用性。 比如Td&#xff0c;同步对时&#xff0c;内参&#xff0c;外参这一串 最近比较忙&#xff0c;简单写点全局快门和轮速计的东…

图解:卷帘快门(Rolling shutter)与全局快门(global shutter)的区别

什么是快门 快门是照相机用来控制感光片有效曝光时间的机构。是照相机的一个重要组成部分&#xff0c;它的结构、形式及功能是衡量照相机档次的一个重要因素。 什么是Global Shutter&#xff08;Total Shutter&#xff09;&#xff1f; 通过整幅场景在同一时间曝光实现的。Sens…