1、前言
go语言的日志记录实现---提高篇_go 如何根据key value的形式进行日志上报-CSDN博客
前面我们日志加入了一些基层的东西,以及设置日志路径,读写模式,打印级别,打印模式等。
这里我们 再新增一个内容,设置日志的大小以及超出大小之后的操作。
2、参数设置
增加俩api
//日志大小 默认10M
var logMaxFileSize int64 = 5
//日志超大时的操作,默认按照日期重命名
var logOverPolicy = L_RENAME_DATE
//设置日志文件大小
func LogSetMaxSize(logsize int64) {
logMaxFileSize = logsize
}
//设置日志文件超过最大内存的策略
func LogSetOverPolicy(logop int) {
logOverPolicy = logop
}
提供外接接口,设置 文件的大小,以及策略。当前策略支持加日期以及index的后缀,以及删除日志文件。
3、策略的实现
获取日志文件的大小:
//文件是否 存在
func checkFileExist(name string) bool {
_, err := os.Stat(name)
if err == nil {
return true
}
if os.IsNotExist(err) {
return false
}
return true
}
//日志文件大小,返回按照KB单位
func getFileSize(filename string) int64 {
var result int64
if true != checkFileExist(filename) {
return 0
}
filepath.Walk(filename, func(path string, f os.FileInfo, err error) error {
result = f.Size()
return nil
})
return result/1024 +1
}
日志文件策略处理
func logFileOverProcess() {
var newFileName string
//全路径
fileFull := getLogFile() // ./testlog.log
//带后缀的文件名
fileName := path.Base(fileFull) // testlog.log
//文件后缀
fileNameSuffix := path.Ext(fileName) // .log
//纯文件名
fileNameOnly :=strings.TrimSuffix(fileName, fileNameSuffix) // testlog
//当前系统时间
if logOverPolicy == L_RENAME_DATE {
//t := time.Now()
//fmt.Println(time.Now().Format("2006-01-02 15:04:05")) // 这是个奇葩,必须是这个时间点, 据说是go诞生之日, 记忆方法:6-1-2-3-4-5
cur := fmt.Sprintf("%s", time.Now().Format("20060102150405"))
newFileName = fmt.Sprintf("/%s_%s%s",fileNameOnly,cur,fileNameSuffix)
}else if logOverPolicy == L_RENAME_INDEX {
newFileName = fmt.Sprintf("/%s.%d%s",fileNameOnly,logIndex,fileNameSuffix)
logIndex ++
}else if logOverPolicy == L_DELETE {
err := os.Remove(fileFull)
if err != nil {
fmt.Println("remove file Error", err)
}
return
}
//文件重命名
err := os.Rename(fileFull, getLogFilePath(fileFull) + newFileName)
if err != nil {
fmt.Println("reName Error", err)
}
return
}
然后我们需要在日志打印的时候增加如下处理:
//日志大小
fsize := getFileSize(getLogFile());
if fsize > logMaxFileSize {
logFileOverProcess()
}