Files
loggerx/storage.go
T

73 lines
1.3 KiB
Go
Raw Normal View History

2024-01-23 00:12:08 +08:00
package loggerx
2024-02-03 01:57:56 +08:00
import (
"io"
2024-11-22 20:08:25 +08:00
"sync"
2024-02-03 01:57:56 +08:00
)
2024-01-23 00:12:08 +08:00
2024-11-22 20:08:25 +08:00
// 写入,需要判断同步还是异步
2024-01-23 00:12:08 +08:00
func (l *Logger) write(event string, b []byte) (n int, err error) {
2024-11-22 20:08:25 +08:00
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) {
2024-01-23 00:12:08 +08:00
2024-07-09 15:36:11 +08:00
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)
}
2024-04-21 12:23:26 +08:00
}
2024-01-23 00:12:08 +08:00
}
2024-04-21 12:23:26 +08:00
if len(l.option.drivers) > 0 {
io.MultiWriter(l.option.drivers...).Write(b)
}
return n, err
2024-01-23 00:12:08 +08:00
}
2024-11-22 20:08:25 +08:00
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
}