Added stdout / stderr for stdout logger

This commit is contained in:
Matthias Fulz 2022-06-27 01:00:25 +02:00
parent 90a50cc61a
commit c4ac480be7
5 changed files with 59 additions and 24 deletions

View File

@ -15,13 +15,21 @@ type BufferLogger struct {
silent bool
}
func (b *BufferLogger) Write(p []byte) (n int, err error) {
func (b *BufferLogger) write(p []byte) (n int, err error) {
b.m.Lock()
defer b.m.Unlock()
return b.w.Write(p)
}
func (b *BufferLogger) Write(p []byte) (n int, err error) {
return b.write(p)
}
func (b *BufferLogger) WriteE(p []byte) (n int, err error) {
return b.write(p)
}
func (b *BufferLogger) Close() error {
b.FlushAll()
@ -41,7 +49,7 @@ func (b *BufferLogger) FlushAll() {
b.w = bufio.NewWriter(&b.b)
}
func NewBufferLogger(silent bool) io.WriteCloser {
func NewBufferLogger(silent bool) SLogLogI {
ret := &BufferLogger{}
ret.w = bufio.NewWriter(&ret.b)
ret.silent = silent

View File

@ -1,7 +1,6 @@
package slog
import (
"io"
"time"
)
@ -11,7 +10,7 @@ type ChannelLogger struct {
t *time.Duration
}
func (c *ChannelLogger) Write(p []byte) (n int, err error) {
func (c *ChannelLogger) write(p []byte) (n int, err error) {
if c.b {
c.blockWrite(p)
} else {
@ -21,6 +20,14 @@ func (c *ChannelLogger) Write(p []byte) (n int, err error) {
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
}
@ -46,7 +53,7 @@ func (c *ChannelLogger) nonBlockWrite(p []byte) {
}
}
func NewChannelLogger(block bool, buffer int, timeout *time.Duration) (ret io.Writer, cret chan string) {
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

View File

@ -2,7 +2,6 @@ package slog
import (
"fmt"
"io"
"os"
"sync"
)
@ -35,7 +34,7 @@ func (f *FileLogger) flush() {
}
}
func (f *FileLogger) Write(p []byte) (n int, err error) {
func (f *FileLogger) write(p []byte) (n int, err error) {
if f.w == nil {
return 0, fmt.Errorf("No file handle available")
}
@ -61,6 +60,14 @@ func (f *FileLogger) Write(p []byte) (n int, err error) {
return f.w.Write(p)
}
func (f *FileLogger) Write(p []byte) (n int, err error) {
return f.write(p)
}
func (f *FileLogger) WriteE(p []byte) (n int, err error) {
return f.write(p)
}
func (f *FileLogger) Close() error {
if f.w == nil {
return nil
@ -71,7 +78,7 @@ func (f *FileLogger) Close() error {
return f.w.Close()
}
func newFileLogger(file string, buffer int) (ret io.WriteCloser, err error) {
func newFileLogger(file string, buffer int) (ret SLogLogI, err error) {
rret := &FileLogger{}
rret.buffered = false
@ -86,10 +93,10 @@ func newFileLogger(file string, buffer int) (ret io.WriteCloser, err error) {
return rret, nil
}
func NewFileLogger(file string) (ret io.WriteCloser, err error) {
func NewFileLogger(file string) (ret SLogLogI, err error) {
return newFileLogger(file, 0)
}
func NewBufferedFileLogger(file string, buffer int) (ret io.WriteCloser, err error) {
func NewBufferedFileLogger(file string, buffer int) (ret SLogLogI, err error) {
return newFileLogger(file, buffer)
}

25
slog.go
View File

@ -8,6 +8,11 @@ import (
"time"
)
type SLogLogI interface {
io.WriteCloser
WriteE(p []byte) (int, error)
}
type SLogFormatFct func(level SLogLevel, verbose bool, timeformat string, format string, a ...interface{}) string
func defaultSLogFormatFct(level SLogLevel, verbose bool, timeformat string, format string, a ...interface{}) string {
@ -70,7 +75,7 @@ type SLogger struct {
verbose bool
formatfct SLogFormatFct
timeformat string
loggers []io.WriteCloser
loggers []SLogLogI
}
func NewSLogger() (ret *SLogger) {
@ -79,7 +84,7 @@ func NewSLogger() (ret *SLogger) {
ret.verbose = false
ret.timeformat = "2006-01-02 15:04:05 MST"
ret.formatfct = defaultSLogFormatFct
ret.loggers = []io.WriteCloser{NewStdoutLogger()}
ret.loggers = []SLogLogI{NewStdoutLogger()}
return ret
}
@ -93,7 +98,11 @@ func (sl *SLogger) log(level SLogLevel, format string, a ...interface{}) {
msg := sl.formatfct(level, sl.verbose, sl.timeformat, format, a...)
for _, l := range sl.loggers {
l.Write([]byte(msg))
if level == ERROR {
l.WriteE([]byte(msg))
} else {
l.Write([]byte(msg))
}
}
}
@ -177,11 +186,11 @@ func SET_TIMEFORMAT(timeformat string) {
defaultSLog.SetTimeFormat(timeformat)
}
func ADD_LOGGER(logger io.WriteCloser) {
func ADD_LOGGER(logger SLogLogI) {
defaultSLog.AddLogger(logger)
}
func SET_LOGGERS(loggers []io.WriteCloser) {
func SET_LOGGERS(loggers []SLogLogI) {
defaultSLog.SetLoggers(loggers)
}
@ -209,16 +218,16 @@ func (sl *SLogger) SetTimeFormat(format string) {
sl.timeformat = format
}
func (sl *SLogger) AddLogger(logger io.WriteCloser) {
func (sl *SLogger) AddLogger(logger SLogLogI) {
sl.loggers = append(sl.loggers, logger)
}
func (sl *SLogger) SetLoggers(loggers []io.WriteCloser) {
func (sl *SLogger) SetLoggers(loggers []SLogLogI) {
sl.loggers = loggers
}
func (sl *SLogger) ClearLoggers() {
sl.loggers = []io.WriteCloser{}
sl.loggers = []SLogLogI{}
}
func (sl *SLogger) Finish() {

View File

@ -1,13 +1,11 @@
package slog
import (
"io"
"os"
"sync"
)
type StdoutLogger struct {
w io.WriteCloser
m sync.Mutex
}
@ -15,19 +13,25 @@ func (s *StdoutLogger) Write(p []byte) (n int, err error) {
s.m.Lock()
defer s.m.Unlock()
return s.w.Write(p)
return os.Stdout.Write(p)
}
func (s *StdoutLogger) WriteE(p []byte) (n int, err error) {
s.m.Lock()
defer s.m.Unlock()
return os.Stderr.Write(p)
}
func (s *StdoutLogger) Close() error {
s.m.Lock()
defer s.m.Unlock()
return s.w.Close()
return nil
}
func NewStdoutLogger() io.WriteCloser {
func NewStdoutLogger() SLogLogI {
ret := &StdoutLogger{}
ret.w = os.Stdout
return ret
}