一,自定义io.Writer需要实现什么接口?
package iotype Writer interface {Write(p []byte) (n int, err error)
}
二,Writer类代码:
package fileWriterimport ("io""os""sync""time"
)type FileWriter struct {mutex sync.RWMutexfileDate stringfilePath stringfileNamePrefix stringfileHandler *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()//先得到writerout, 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()//得到BufferedWriteSyncerasyncWriter := &zapcore.BufferedWriteSyncer{WS: zapcore.AddSync(writer),FlushInterval: time.Minute, //1分钟后写入Size: 512 * 1024, //超过512 kB后写入,}