Files
gocryptotrader/log/logger.go
Ryan O'Hara-Reid ac692b04f4 log: fix bug, expand test coverage and slightly optimize (#847)
* log: fix bugs expand coverage and optimise

* log: fix linter issues

* log: fix linter issue and pack methods in same file

* log: drop defer

* logger: move global check inside getfields  and remove unused test function

* logger: Increase note thanks @gloriouscode

* logger: wrap error with writer type

* logger: change variable name

* logger: change variable names and remove validsublogger func as it doesn't add functionality over a standard map call

* logs: error when unsupported output is applied on setup calls

* logs: add glorious suggestion

* logger: add protection to reduce olympic gold medal races

* logger: fix linter issues

* log: glorious niterinos
2021-11-30 16:43:27 +11:00

85 lines
2.0 KiB
Go

package log
import (
"errors"
"fmt"
"io"
"time"
)
var (
errEmptyLoggerName = errors.New("cannot have empty logger name")
errSubLoggerAlreadyregistered = errors.New("sub logger already registered")
)
func newLogger(c *Config) Logger {
return Logger{
Timestamp: c.AdvancedSettings.TimeStampFormat,
Spacer: c.AdvancedSettings.Spacer,
ErrorHeader: c.AdvancedSettings.Headers.Error,
InfoHeader: c.AdvancedSettings.Headers.Info,
WarnHeader: c.AdvancedSettings.Headers.Warn,
DebugHeader: c.AdvancedSettings.Headers.Debug,
ShowLogSystemName: *c.AdvancedSettings.ShowLogSystemName,
}
}
func (l *Logger) newLogEvent(data, header, slName string, w io.Writer) error {
if w == nil {
return errors.New("io.Writer not set")
}
pool, ok := eventPool.Get().(*[]byte)
if !ok {
return errors.New("unable to type assert slice of bytes pointer")
}
*pool = append(*pool, header...)
if l.ShowLogSystemName {
*pool = append(*pool, l.Spacer...)
*pool = append(*pool, slName...)
}
*pool = append(*pool, l.Spacer...)
if l.Timestamp != "" {
*pool = time.Now().AppendFormat(*pool, l.Timestamp)
}
*pool = append(*pool, l.Spacer...)
*pool = append(*pool, data...)
if data == "" || data[len(data)-1] != '\n' {
*pool = append(*pool, '\n')
}
_, err := w.Write(*pool)
*pool = (*pool)[:0]
eventPool.Put(pool)
return err
}
// CloseLogger is called on shutdown of application
func CloseLogger() error {
return GlobalLogFile.Close()
}
// Level retries the current sublogger levels
func Level(name string) (Levels, error) {
RWM.RLock()
defer RWM.RUnlock()
subLogger, found := SubLoggers[name]
if !found {
return Levels{}, fmt.Errorf("logger %s not found", name)
}
return subLogger.levels, nil
}
// SetLevel sets sublogger levels
func SetLevel(s, level string) (Levels, error) {
RWM.Lock()
defer RWM.Unlock()
subLogger, found := SubLoggers[s]
if !found {
return Levels{}, fmt.Errorf("sub logger %v not found", s)
}
subLogger.SetLevels(splitLevel(level))
return subLogger.levels, nil
}