go:自定义io.writer供zap使用,按日期分割日志文件

一,自定义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后写入,
	}

 

posted @ 2025-02-23 17:38  刘宏缔的架构森林  阅读(112)  评论(0)    收藏  举报