@@ -55,17 +55,18 @@ func (self *syncBuffer) write(b []byte) {
5555}
5656
5757type FileBackend struct {
58- mu sync.Mutex
59- dir string // directory for log files
60- files [numSeverity ]syncBuffer
61- flushInterval time.Duration
62- rotateNum int
63- maxSize uint64
64- fall bool
65- rotateByHour bool
66- lastCheck uint64
67- reg * regexp.Regexp // for rotatebyhour log del...
68- keepHours uint // keep how many hours old, only make sense when rotatebyhour is T
58+ mu sync.Mutex
59+ dir string // directory for log files
60+ files [numSeverity ]syncBuffer
61+ flushInterval time.Duration
62+ rotateNum int
63+ maxSize uint64
64+ fall bool
65+ rotateByHour bool
66+ lastCheck uint64
67+ reg * regexp.Regexp // for rotatebyhour log del...
68+ keepHours uint // keep how many hours old, only make sense when rotatebyhour is T
69+ outputToOneFile bool
6970}
7071
7172func (self * FileBackend ) Flush () {
@@ -75,7 +76,6 @@ func (self *FileBackend) Flush() {
7576 self .files [i ].Flush ()
7677 self .files [i ].Sync ()
7778 }
78-
7979}
8080
8181func (self * FileBackend ) Close () {
@@ -123,7 +123,7 @@ func (self *FileBackend) rotateByHourDaemon() {
123123 files , err := ioutil .ReadDir (self .dir )
124124 if err == nil {
125125 for _ , file := range files {
126- // exactly match, then we
126+ // exactly match, then remove
127127 if file .Name () == self .reg .FindString (file .Name ()) &&
128128 shouldDel (file .Name (), self .keepHours ) {
129129 os .Remove (filepath .Join (self .dir , file .Name ()))
@@ -138,35 +138,43 @@ func (self *FileBackend) monitorFiles() {
138138 for range time .NewTicker (time .Second * 5 ).C {
139139 for i := 0 ; i < numSeverity ; i ++ {
140140 fileName := path .Join (self .dir , severityName [i ]+ ".log" )
141- if _ , err := os .Stat (fileName ); err != nil && os .IsNotExist (err ) {
142- if f , err := os .OpenFile (fileName , os .O_APPEND | os .O_CREATE | os .O_WRONLY , 0644 ); err == nil {
143- self .mu .Lock ()
144- self .files [i ].close ()
145- self .files [i ].Writer = bufio .NewWriterSize (f , bufferSize )
146- self .files [i ].file = f
147- self .mu .Unlock ()
148- }
149- }
141+ self .monitorFile (fileName , & self .files [i ])
142+ }
143+ }
144+ }
145+
146+ func (self * FileBackend ) monitorFile (fileName string , sb * syncBuffer ) {
147+ if _ , err := os .Stat (fileName ); err != nil && os .IsNotExist (err ) {
148+ if f , err := os .OpenFile (fileName , os .O_APPEND | os .O_CREATE | os .O_WRONLY , 0644 ); err == nil {
149+ self .mu .Lock ()
150+ sb .close ()
151+ sb .Writer = bufio .NewWriterSize (f , bufferSize )
152+ sb .file = f
153+ self .mu .Unlock ()
150154 }
151155 }
152156}
153157
154158func (self * FileBackend ) Log (s Severity , msg []byte ) {
155159 self .mu .Lock ()
156- switch s {
157- case FATAL :
158- self .files [FATAL ].write (msg )
159- case ERROR :
160- self .files [ERROR ].write (msg )
161- case WARNING :
162- self .files [WARNING ].write (msg )
163- case INFO :
164- self .files [INFO ].write (msg )
165- case DEBUG :
166- self .files [DEBUG ].write (msg )
167- }
168- if self .fall && s < INFO {
169- self .files [INFO ].write (msg )
160+ if self .outputToOneFile {
161+ self .files [ALL ].write (msg )
162+ } else {
163+ switch s {
164+ case FATAL :
165+ self .files [FATAL ].write (msg )
166+ case ERROR :
167+ self .files [ERROR ].write (msg )
168+ case WARNING :
169+ self .files [WARNING ].write (msg )
170+ case INFO :
171+ self .files [INFO ].write (msg )
172+ case DEBUG :
173+ self .files [DEBUG ].write (msg )
174+ }
175+ if self .fall && s < INFO {
176+ self .files [INFO ].write (msg )
177+ }
170178 }
171179 self .mu .Unlock ()
172180 if s == FATAL {
@@ -203,6 +211,11 @@ func (self *FileBackend) SetFlushDuration(t time.Duration) {
203211 self .flushInterval = time .Second
204212 }
205213}
214+
215+ func (self * FileBackend ) OutputToOneFile (flag bool ) {
216+ self .outputToOneFile = flag
217+ }
218+
206219func NewFileBackend (dir string ) (* FileBackend , error ) {
207220 if err := os .MkdirAll (dir , 0755 ); err != nil {
208221 return nil , err
@@ -215,21 +228,9 @@ func NewFileBackend(dir string) (*FileBackend, error) {
215228 if err != nil {
216229 return nil , err
217230 }
218-
219- count := uint64 (0 )
220- stat , err := f .Stat ()
221- if err == nil {
222- count = uint64 (stat .Size ())
223- }
224- fb .files [i ] = syncBuffer {
225- Writer : bufio .NewWriterSize (f , bufferSize ),
226- file : f ,
227- filePath : fileName ,
228- parent : & fb ,
229- count : count ,
230- }
231-
231+ fb .files [i ] = newSyncBuffer (f , & fb , fileName )
232232 }
233+
233234 // default
234235 fb .flushInterval = time .Second * 3
235236 fb .rotateNum = 20
@@ -238,7 +239,7 @@ func NewFileBackend(dir string) (*FileBackend, error) {
238239 fb .lastCheck = 0
239240 // init reg to match files
240241 // ONLY cover this centry...
241- fb .reg = regexp .MustCompile ("(INFO|ERROR|WARNING|DEBUG|FATAL)\\ .log\\ .20[0-9]{8}" )
242+ fb .reg = regexp .MustCompile ("(INFO|ERROR|WARNING|DEBUG|FATAL|ALL )\\ .log\\ .20[0-9]{8}" )
242243 fb .keepHours = 24 * 7
243244
244245 go fb .flushDaemon ()
@@ -247,6 +248,21 @@ func NewFileBackend(dir string) (*FileBackend, error) {
247248 return & fb , nil
248249}
249250
251+ func newSyncBuffer (f * os.File , fb * FileBackend , fileName string ) syncBuffer {
252+ count := uint64 (0 )
253+ stat , err := f .Stat ()
254+ if err == nil {
255+ count = uint64 (stat .Size ())
256+ }
257+ return syncBuffer {
258+ Writer : bufio .NewWriterSize (f , bufferSize ),
259+ file : f ,
260+ filePath : fileName ,
261+ parent : fb ,
262+ count : count ,
263+ }
264+ }
265+
250266func Rotate (rotateNum1 int , maxSize1 uint64 ) {
251267 if fileback != nil {
252268 fileback .Rotate (rotateNum1 , maxSize1 )
0 commit comments