当前位置: 首页 > news >正文

西安做网站的公司在哪企业网站推广优化公司

西安做网站的公司在哪,企业网站推广优化公司,四川德阳做网站和app,上海网站设计公司有哪些理解底层— —Golang的log库,实现自定义Logger 1 分析实现思路 基于golang中自带的log库实现:对日志实现设置日志级别,每天生成一个文件,同时添加上前缀以及展示文件名等 日志级别,通过添加prefix:[INFO]、…

理解底层— —Golang的log库,实现自定义Logger

1 分析实现思路

基于golang中自带的log库实现:对日志实现设置日志级别,每天生成一个文件,同时添加上前缀以及展示文件名等

  • 日志级别,通过添加prefix:[INFO]、[DEBUG]等来实现
  • 每天生成一个日志文件:写日志之前判断当前时间是否为新的一天
  • 日志文件命名:获取每天的时间来实现命名,同时添加读写锁保证并发安全
  • 获取调用日志文件代码行数及文件名:runtime.Caller获取函数调用栈

2 实战

2.1 server.go

package mainimport "myTest/inter/log_pro/logger"func main() {logger.SetFile("/Users/xsky/GolandProjects/MyTest/inter/log_pro/log/demo.log")logger.SetLevel(0)logger.Debug("hello %s", "ziyi")logger.Info("hello %s", "ziyi")
}

2.2 logger.go

package loggerimport ("log""os""runtime""strconv""strings""sync""time"
)//基于log库自定义实现logger
var (infoLogger  *log.LoggerdebugLogger *log.LoggerlogOut     *os.FilelogLevel   intcurrentDay int //每天生成一个日志文件logFile    stringfileLock   sync.RWMutex //读写锁,保证同一时间只有一个协程重命名文件
)const (DebugLevel = iota //0InfoLevel         //1
)func SetLevel(level int) {logLevel = level
}func init() {fileLock = sync.RWMutex{}
}func SetFile(file string) {var err errorlogOut, err = os.OpenFile(file, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0664)if err != nil {panic(err)} else {//初始化自定义的Logger(基于golang中的log库)//log.LstdFlags表示时间格式等//log.Llongfile表示文件名及调用代码的位置,log.Llongfile=》改为通过getCallTrace获取前缀currentDay = time.Now().YearDay()infoLogger = log.New(logOut, "[INFO] ", log.LstdFlags)debugLogger = log.New(logOut, "[DEBUG] ", log.LstdFlags)logFile = file}
}func checkIfDayChange() {fileLock.Lock()defer fileLock.Unlock()day := time.Now().YearDay()if day == currentDay {return} else {//关闭之前的文件,重命名,并生成新的文件logOut.Close()postFix := time.Now().Add(-24 * time.Hour).Format("20060102")err := os.Rename(logFile, logFile+"."+postFix)if err != nil {//TODO 重命名日志文件失败,根据自身情况做处理}logOut, err = os.OpenFile(logFile, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0664)if err != nil {//TODO 打开新的日志文件失败,根据自己业务需求做处理}infoLogger = log.New(logOut, "[INFO] ", log.LstdFlags)debugLogger = log.New(logOut, "[DEBUG] ", log.LstdFlags)currentDay = day}
}//golang中的any相当于interface{}空接口
func Debug(format string, v ...any) {if logLevel <= DebugLevel {checkIfDayChange()debugLogger.Printf(getPrefix()+format, v)}
}func Info(format string, v ...any) {if logLevel <= InfoLevel {checkIfDayChange()infoLogger.Printf(getPrefix()+format, v)}
}//获取函数调用栈关系:拿到调用Info或者Debug所在的文件名及代码行数(runtime包)
func getCallTrace() (string, int) {_, file, lineNo, ok := runtime.Caller(3)if ok {return file, lineNo} else {return "", 0}
}//获取调用Info、Debug代码所在行数,文件名只获取最后三级
func getPrefix() string {file, lineNo := getCallTrace()path := strings.Split(file, "/")if len(path) > 3 {file = strings.Join(path[len(path)-3:], "/")}return file + ":" + strconv.Itoa(lineNo) + " "
}

3 效果

运行server.go查看效果:

在这里插入图片描述

目录结构:
在这里插入图片描述

http://www.15wanjia.com/news/195517.html

相关文章:

  • 漳州市住房城乡建设局网站电子商务网站推广策略主要内容
  • 上蔡网站建设北京网站制作公司都在哪里
  • 推荐几个好的网址网站页面优化公告
  • 徐州城乡建设局安监处网站个人网站设计内容
  • 昆山 网站建设 企炬代理商平台
  • 网站建设代理深圳市住房和建设局网官网
  • 做云词图的网站泉州网站建设的步骤
  • 免费做网页的网站网站上的楼价走势图怎么做
  • 前端和网站部署做网站的龙溪网站制作
  • 买卖交易平台优化方案物理电子版
  • 上海建智建设人才培训中心网站美食网站怎么做
  • 罗湖做网站的公司建网站和开发软件哪个难
  • 沈阳网络建网站个人十堰市住房和城乡建设厅官方网站
  • 网站建设公司骗人wordpress提速
  • 官方网站下载派的app网站建设征集通讯员的通知
  • 英语网站 php源码在线oa
  • 重庆快速网站推广荣成市信用建设网站
  • 张家界旅游网站官网跨境电商平台有哪些推广方式
  • 网页设计模板的网站有哪些网站是可以接单做任务的
  • 网站建设 没市场了吧北京华夏工程建设监理公司网站
  • 北京建站软件销售网站建设实验报告
  • 网站怎么设计百度下载官方下载安装
  • 网站怎么建设高端公司建建设网站
  • 陕西公路工程建设有限公司网站网站建设公司排行榜
  • 百度做网站效果怎么样重庆网站建设建站收费
  • 推荐一个免费的网站深圳网页设计公司推荐
  • 自己建设网站流程自助建设外贸网站
  • 免费开源建站系统源码徐州百度搜索网站排名
  • python做网站快么随州网站优化
  • 网站悬浮qq宁波网站推广优化公司