去语言的日志模块没有提供日志旋转接口,但实际开发中我们需要该功能:
我们不希望单个日志过大,否则文本编辑器无法打开,查看比较困难;
更不希望占用太大的存储空间,可以指定最多存多少个日志文件。
借助带缓冲的通道来实现。
<强>示例代码如下:
/*
golang日志旋转的例子
*/主要包
导入(
“fmt”
“日志”
“操作系统”
“时间”
)
常量(
BACKUP_COUNT=5
MAX_FILE_BYTES=2 * 1024
)
func doRotate (fPrefix字符串){
j:=BACKUP_COUNT;j祝辞=1;j - {
curFileName:=fmt.Sprintf (“% s_ % d.log fPrefix, j)
凯西:=j - 1
preFileName:=fmt.Sprintf (“% s_ % d.log fPrefix, k)
如果k==0 {
preFileName=fmt.Sprintf (“% s。日志”,fPrefix)
}
_,犯错:=os.Stat (curFileName)
如果做错了==nil {
os.Remove (curFileName)
fmt。Println(“删除:“curFileName)
}
_,呃=os.Stat (preFileName)
如果做错了==nil {
fmt。Println (“preFileName重命名:“,”=比;”,curFileName)
呃=操作系统。重命名(preFileName curFileName)
如果犯错!=nil {
fmt.Println (err)
}
}
}
}
func NewLogger (fPrefix字符串)(*日志。记录器,* os.File) {
var记录器* log.Logger
文件名:=fmt.Sprintf (“% s。日志”,fPrefix)
fmt。Println(文件名:文件名)
日志文件,犯错:=操作系统。OpenFile(文件名,os.O_RDWR | os.O_CREATE |操作系统。O_APPEND, 0666)
如果犯错!=nil {
fmt。Println(“打开文件错误!”)
其他}{
记录器=日志。新(日志文件,“(调试)”,log.Ldate | log.Ltime | log.Lshortfile)
}
返回日志,日志文件
}
func logWorker (msgQueue & lt;脚板字符串){
fPrefix:=拔毒?
日志,日志文件:=NewLogger (fPrefix)
味精:=范围msgQueue {
logger.Println(味精)
fi err2:=logFile.Stat ()
如果err2==nil {
如果fi.Size()在MAX_FILE_BYTES {
logFile.Close ()
doRotate (fPrefix)
日志,日志文件=NewLogger (fPrefix)
}
}
}
logFile.Close ()
}
函数main () {
陈msgQueue:=(字符串,1000)
去logWorker (msgQueue)
j:=1;j & lt;=1000;j + + {
msgQueue & lt;——fmt。Sprintf (“msg_ % d j)
时间。睡眠(1 * time.Second)
}
关上(msgQueue)
返回
}
运行效果如下:
(root@local t2) #。/logRotateTest1
文件名:msg.log
重命名:味精。日志=比;msg_1.log
文件名:msg.log
重命名:msg_1。日志=比;msg_2.log
重命名:味精。日志=比;msg_1.log
文件名:msg.log
重命名:msg_2。日志=比;msg_3.log
重命名:msg_1。日志=比;msg_2.log
重命名:味精。日志=比;msg_1.log
文件名:msg.log
^ C
这里只是个简单的示例代码,实现了日志旋转,更多功能需自行开发。
好,就这些了,希望对你有帮助。
以上这篇golang之日志旋转详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。