Files
vRp.CD2g_test/utils/log/survey/flusher_file.go

75 lines
1.6 KiB
Go

package survey
import (
"bufio"
"fmt"
"github.com/kercylan98/minotaur/utils/log"
"os"
"path/filepath"
"strings"
"time"
)
// NewFileFlusher 创建一个文件刷新器
// - layout 为日志文件名的时间戳格式 (默认为 time.DateOnly)
func NewFileFlusher(filePath string, layout ...string) *FileFlusher {
fn := filepath.Base(filePath)
ext := filepath.Ext(fn)
fn = strings.TrimSuffix(fn, ext)
dir := filepath.Dir(filePath)
_ = os.MkdirAll(dir, 0666)
fl := &FileFlusher{
dir: dir,
fn: fn,
fe: ext,
layout: time.DateOnly,
layoutLen: len(time.DateOnly),
}
if len(layout) > 0 {
fl.layout = layout[0]
fl.layoutLen = len(fl.layout)
}
return fl
}
type FileFlusher struct {
dir string
fn string
fe string
layout string
layoutLen int
}
func (slf *FileFlusher) Flush(records []string) {
var (
file *os.File
writer *bufio.Writer
err error
last string
)
for _, data := range records {
tick := data[0:slf.layoutLen]
if tick != last {
if file != nil {
_ = writer.Flush()
_ = file.Close()
}
fp := filepath.Join(slf.dir, fmt.Sprintf("%s.%s%s", slf.fn, tick, slf.fe))
file, err = os.OpenFile(fp, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatal("Survey", log.String("Action", "DateSwitch"), log.String("FilePath", fp), log.Err(err))
return
}
writer = bufio.NewWriterSize(file, 1024*10240)
last = tick
}
_, _ = writer.WriteString(data)
}
_ = writer.Flush()
_ = file.Close()
}
func (slf *FileFlusher) Info() string {
return fmt.Sprintf("%s/%s.${DATE}%s", slf.dir, slf.fn, slf.fe)
}