59 lines
1019 B
Go
59 lines
1019 B
Go
|
package handler
|
||
|
|
||
|
import (
|
||
|
"os"
|
||
|
"path"
|
||
|
"sync"
|
||
|
)
|
||
|
|
||
|
// FileHandler writes xlog to a file.
|
||
|
type FileHandler struct {
|
||
|
fileName string
|
||
|
flag int
|
||
|
fd *os.File
|
||
|
fdLock *sync.RWMutex
|
||
|
}
|
||
|
|
||
|
func NewFileHandler(fileName string, flag int) (*FileHandler, error) {
|
||
|
dir := path.Dir(fileName)
|
||
|
os.Mkdir(dir, 0777)
|
||
|
|
||
|
f, err := os.OpenFile(fileName, flag, 0666)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
h := new(FileHandler)
|
||
|
|
||
|
h.fileName = fileName
|
||
|
h.flag = flag
|
||
|
h.fd = f
|
||
|
h.fdLock = &sync.RWMutex{}
|
||
|
|
||
|
return h, nil
|
||
|
}
|
||
|
|
||
|
//func (h *FileHandler) Rotate() {
|
||
|
// fd, err := os.OpenFile(h.fileName, h.flag, 0666)
|
||
|
// if err != nil {
|
||
|
// h.fd.Write([]byte(fmt.Sprintf("interval check xlog file %v open error:%v", h.fileName, err)))
|
||
|
// return
|
||
|
// }
|
||
|
//
|
||
|
// h.fdLock.Lock()
|
||
|
// oldFd := h.fd
|
||
|
// h.fd = fd
|
||
|
// oldFd.Close()
|
||
|
// h.fdLock.Unlock()
|
||
|
//}
|
||
|
|
||
|
func (h *FileHandler) Write(b []byte) (n int, err error) {
|
||
|
h.fdLock.RLock()
|
||
|
defer h.fdLock.RUnlock()
|
||
|
return h.fd.Write(b)
|
||
|
}
|
||
|
|
||
|
func (h *FileHandler) Close() error {
|
||
|
return h.fd.Close()
|
||
|
}
|