slog/channellogger.go

64 lines
979 B
Go

package slog
import (
"time"
)
type ChannelLogger struct {
w chan string
b bool
t *time.Duration
}
func (c *ChannelLogger) write(p []byte) (n int, err error) {
if c.b {
c.blockWrite(p)
} else {
c.nonBlockWrite(p)
}
return len(p), nil
}
func (c *ChannelLogger) Write(p []byte) (n int, err error) {
return c.write(p)
}
func (c *ChannelLogger) WriteE(p []byte) (n int, err error) {
return c.write(p)
}
func (c *ChannelLogger) Close() error {
return nil
}
func (c *ChannelLogger) blockWrite(p []byte) {
if c.t == nil {
c.w <- string(p)
return
}
select {
case c.w <- string(p):
return
case <-time.After(*c.t):
return
}
}
func (c *ChannelLogger) nonBlockWrite(p []byte) {
select {
case c.w <- string(p):
return
}
}
func NewChannelLogger(block bool, buffer int, timeout *time.Duration) (ret SLogLogI, cret chan string) {
rret := &ChannelLogger{}
rret.w = make(chan string, buffer)
rret.b = block
rret.t = timeout
return rret, rret.w
}