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

本文深入探讨了Go语言中日志管理的高级技巧,包括如何设置日志文件的大小限制,以及当日志文件超出指定大小时的处理策略。通过API调用,可以灵活配置日志文件的大小,并选择日志溢出后的处理方式,如按日期重命名、添加索引或直接删除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、前言

go语言的日志记录实现---提高篇_go 如何根据key value的形式进行日志上报-优快云博客

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

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hemy08

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值