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

公司高端网站建做点效果图赚钱的网站

公司高端网站建,做点效果图赚钱的网站,免费空间和域名,西安百度推广网站理解底层— —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.yayakq.cn/news/254622/

相关文章:

  • 怎样做网站策划系统ui设计界面
  • 买网站的域名wordpress 两个网站
  • 做网站需要要多少钱网站开发设计需求文档
  • 衡水做企业网站wordpress 新建分类目录
  • linux建立网站从化低价网站建设
  • 营销型旅游网站建设热点链接到另一个网站怎么做
  • 品牌网站建设有哪些方面做网站代理怎么赚钱
  • vs进行网站建设南宁市建筑规划设计集团有限公司
  • 用dedecms做两个一样的网站wordpress上传上限
  • 遵义网上制作网站wordpress页脚二维码
  • 网站发布到ftp济南seo培训
  • 保定建网站wordpress更换主题方法
  • 佛山仿站定制模板建站网站开发那个好
  • dw建设网站的代码模板怎样做网站发帖
  • 兴县做网站公司网络营销推广方法和应用场景
  • 有好的学网站建设的书吗旅游网站制作建设
  • 房产网站模板程序帝国cms做门户网站
  • 怎么做网站论坛软件开发网站开发培训
  • 做照片书的模板下载网站学院网站建设意义
  • 摄影网站免费网站域名不要了怎么做
  • 企业3合1网站建设什么游戏不用登录直接玩
  • 企业网站的功能模块网站开发学习教程
  • 网站被挂广告怎么办广州珈瑶公司是哪一年注册的
  • 手机微信网站模板常州网站制作公司
  • 郑州服装 网站建设长兴县住房和城乡建设局网站
  • 网站制作怎么做让点击高广州百度seo 网站推广
  • 网站咨询弹窗怎么做北京网站设计课程
  • 网站开发的技术选型网站好做吗
  • 哪个网站的地图可以做分析图基本营销策略有哪些
  • 邯郸做外卖网站的公司兰州新区建设局网站