blob: 651951d4396c9b57333dca673e9435efbce15f76 [file] [log] [blame]
/******************************************************
# DESC :
# AUTHOR : Alex Stocks
# VERSION : 1.0
# LICENCE : Apache License 2.0
# EMAIL : alexstocks@foxmail.com
# MOD : 2018-03-25 19:35
# FILE : buffile.go
******************************************************/
package log4go
import (
"bufio"
"fmt"
"io"
"os"
"sync"
)
import (
"github.com/AlexStocks/goext/strings"
)
type BufFileWriter struct {
filename string
bufSize int
sync.RWMutex
file *os.File
bufWriter *bufio.Writer
writer io.Writer
}
func newBufFileWriter(filename string, bufSize int) *BufFileWriter {
return &BufFileWriter{
filename: filename,
bufSize: bufSize,
}
}
func (w *BufFileWriter) Reset(filename string, bufSize int) {
w.Close()
w.filename = filename
w.bufSize = bufSize
}
func (w *BufFileWriter) open() (*os.File, error) {
w.Lock()
defer w.Unlock()
fd, err := os.OpenFile(w.filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0660)
if err != nil {
return nil, err
}
w.file = fd
w.writer = w.file
if w.bufSize > 0 {
w.bufWriter = bufio.NewWriterSize(w.file, w.bufSize)
w.writer = w.bufWriter
}
return fd, nil
}
func (w *BufFileWriter) Close() error {
w.Flush()
w.Lock()
defer w.Unlock()
if w.file == nil {
return nil
}
w.file.Close()
w.file = nil
w.writer = nil
w.bufWriter = nil
return nil
}
func (w *BufFileWriter) Flush() {
w.Lock()
defer w.Unlock()
if w.bufWriter != nil {
w.bufWriter.Flush()
return
}
if w.file != nil {
w.file.Sync()
}
}
func (w *BufFileWriter) Seek(offset int64, whence int) (int64, error) {
w.Lock()
defer w.Unlock()
if w.file != nil {
return w.file.Seek(offset, whence)
}
fi, err := os.Lstat(w.filename)
if err != nil {
return 0, err
}
return fi.Size(), nil
}
func (w *BufFileWriter) Write(p []byte) (int, error) {
if w.file == nil {
_, err := w.open()
if err != nil {
return 0, err
}
}
w.Lock()
defer w.Unlock()
return fmt.Fprint(w.writer, gxstrings.String(p))
}