73 lines
1.3 KiB
Go
73 lines
1.3 KiB
Go
package loggerx
|
|
|
|
import (
|
|
"io"
|
|
"sync"
|
|
)
|
|
|
|
// 写入,需要判断同步还是异步
|
|
func (l *Logger) write(event string, b []byte) (n int, err error) {
|
|
if l.toAsync(event, b) {
|
|
// fmt.Println("异步写入")
|
|
return len(b), nil
|
|
}
|
|
return l.store(event, b)
|
|
}
|
|
|
|
// 实际的存储
|
|
func (l *Logger) store(event string, b []byte) (n int, err error) {
|
|
|
|
if l.option.isPrintFile {
|
|
f, err := l.getFile(event, false)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
n, err = f.Write(b)
|
|
if err == nil && n < len(b) {
|
|
err = io.ErrShortWrite
|
|
}
|
|
if err != nil {
|
|
// 强制更新 & 再次写入
|
|
f, err := l.getFile(event, true)
|
|
if err == nil {
|
|
f.Write(b)
|
|
}
|
|
}
|
|
}
|
|
|
|
if len(l.option.drivers) > 0 {
|
|
io.MultiWriter(l.option.drivers...).Write(b)
|
|
}
|
|
return n, err
|
|
}
|
|
|
|
var chanStore = make(chan cacheData, 1000)
|
|
var chanOnce = sync.Once{}
|
|
|
|
type cacheData struct {
|
|
logger *Logger
|
|
Event string
|
|
Data []byte
|
|
}
|
|
|
|
func (l *Logger) toAsync(event string, b []byte) bool {
|
|
chanOnce.Do(func() {
|
|
go func() {
|
|
for val := range chanStore {
|
|
val.logger.store(val.Event, val.Data)
|
|
}
|
|
}()
|
|
})
|
|
|
|
if l.writeType == writeTypeSync || // 指定同步模式
|
|
(l.writeType == writeTypeDefault && l.option.writeType != writeTypeAsync) { // 默认同步模式
|
|
return false
|
|
}
|
|
|
|
// 为了避免丢失,还是要阻塞等待
|
|
chanStore <- cacheData{l, event, b}
|
|
|
|
return true
|
|
}
|