一,自定义io.Writer需要实现什么接口?
package io
type Writer interface {
Write(p []byte) (n int, err error)
}
二,Writer类代码:
package fileWriter
import (
"io"
"os"
"sync"
"time"
)
type FileWriter struct {
mutex sync.RWMutex
fileDate string
filePath string
fileNamePrefix string
fileHandler *os.File
}
// New creates a new RotateLogs object. A log filename pattern
// must be passed. Optional `Option` parameters may be passed
func New(filePath string, fileNamePrefix string) (*FileWriter, error) {
//FileWriter初始化
return &FileWriter{
filePath: filePath,
fileNamePrefix: fileNamePrefix,
}, nil
}
func (fw *FileWriter) Write(p []byte) (n int, err error) {
//开始执行write方法
fw.mutex.Lock()
defer fw.mutex.Unlock()
//先得到writer
out, err := fw.getWriter()
if err != nil {
return 0, err
}
return out.Write(p)
}
// must be locked during this operation
func (fw *FileWriter) getWriter() (io.Writer, error) {
//得到当前日期
curDate:= time.Now().Format("20060102")
//fmt.Println("原日期:"+fw.fileDate+",当前日期:"+curDate)
if curDate == fw.fileDate {
//日期一致,无需新打开文件,使用原来打开的文件
return fw.fileHandler,nil
} else {
//日期不一致,关闭原来打开的文件,新打开文件
//关闭当前文件
fw.fileHandler.Close()
fw.fileDate = curDate
//得到新文件的文件名:
fileFullPath:=fw.filePath+"/"+fw.fileNamePrefix+"_"+curDate+".log"
//重新打开一个新文件
fw.fileHandler,_=os.OpenFile(fileFullPath,os.O_WRONLY|os.O_CREATE|os.O_APPEND,06666)
//返回
return fw.fileHandler,nil
}
}
三,构建zap类时应用:
writer,_:=fileWriter.New("/data/gologs/logs","access")
//defer logFile.Close()
//得到BufferedWriteSyncer
asyncWriter := &zapcore.BufferedWriteSyncer{
WS: zapcore.AddSync(writer),
FlushInterval: time.Minute, //1分钟后写入
Size: 512 * 1024, //超过512 kB后写入,
}