vRp.CD2g_test/utils/log/survey/logger.go

82 lines
1.6 KiB
Go

package survey
import (
"bufio"
"fmt"
"github.com/kercylan98/minotaur/utils/log"
"os"
"path/filepath"
"sync"
"time"
)
// logger 用于埋点数据的运营日志记录器
type logger struct {
bl sync.Mutex // writer lock
wl sync.Mutex // flush lock
dir string
fn string
fe string
bs []string
layout string
layoutLen int
dataLayout string
dataLayoutLen int
interval time.Duration
}
// flush 将记录器缓冲区的数据写入到文件
func (slf *logger) flush() {
slf.bl.Lock()
count := len(slf.bs)
if count == 0 {
slf.bl.Unlock()
return
}
ds := slf.bs[:]
slf.bs = slf.bs[count:]
slf.bl.Unlock()
slf.wl.Lock()
defer slf.wl.Unlock()
var (
file *os.File
writer *bufio.Writer
err error
last string
)
for _, data := range ds {
tick := data[0:slf.layoutLen]
if tick != last {
if file != nil {
_ = writer.Flush()
_ = file.Close()
}
fp := slf.filePath(tick)
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()
}
// writer 写入数据到记录器缓冲区
func (slf *logger) writer(d string) {
slf.bl.Lock()
slf.bs = append(slf.bs, d)
slf.bl.Unlock()
}
// filePath 获取文件路径
func (slf *logger) filePath(t string) string {
return filepath.Join(slf.dir, fmt.Sprintf("%s.%s%s", slf.fn, t, slf.fe))
}