/
buffile.go
122 lines (98 loc) · 1.89 KB
/
buffile.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/******************************************************
# 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"
)
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, String(p))
}