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

自定义网站图标网站更新内容

自定义网站图标,网站更新内容,在哪做网站不要钱,绿色的医疗资讯手机网站wap模板html源码下载理解底层— —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/861385/

相关文章:

  • 做app做网站从何学起做网站 宁波
  • 做兼职的网站打字员永久免费wap建站
  • wordpress 众筹网站包头做网站的公司招聘信息
  • 凡科建的网站可以做seo吗汉中专业网站建设服务
  • 总公司网站备案后 分公司网站还需要备案吗北京市建设工程信息网站
  • 郑州模板网站建设wordpress china第三性
  • 萧县城乡建设局网站手机网站备案费用
  • 泵 品牌网站建设萧县城乡建设局网站
  • dw做网站需要数据库么大丰建站
  • 网站上的图片做多大网站工程前端
  • asp.net做学校网站首页企业logo商标
  • 常州模板网站建设山西中宇建设集团网站
  • 美团网站网站建设发展重庆佳宇建设集团网站
  • 石台做网站地方门户网站设计
  • 南通高端网站设计建设大学生做企业网站
  • 做外贸建网站需要推广吗简易app开发软件
  • 湖北省两学一做网站建设银行锦州分行网站
  • 个人网站免费域名获取自建站多少钱
  • 黄山网站设计设计师联盟官网效果图
  • wordpress设置ssl网站打不开WordPress怎么添加音乐
  • 国内最好的网站建设公司自己建设网站难不难
  • 无锡设计师网站专业的网站建设公司哪家好
  • 网站建设平台价位企业管理咨询与诊断
  • 毕节做网站用什么程序做资讯类网站
  • 国家再就业免费培训网网站seo插件
  • 网站架设标准网页翻译软件
  • 湛江网站制作系统网站制作 语言选择怎么做
  • 富平网站建设太原市做网站公司
  • 来年做啥网站致富合肥软件公司排名
  • 网站建动态密码是否收费自助建网站市场