go语言的日志记录实现---提高篇2

1、前言

https://blog.csdn.net/ZHAOJUNWEI08/article/details/86429369

前面我们日志加入了一些基层的东西,以及设置日志路径,读写模式,打印级别,打印模式等。

这里我们 再新增一个内容,设置日志的大小以及超出大小之后的操作。

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()
	}

 

你可能感兴趣的:(go)