diff options
Diffstat (limited to 'logger/logsystem.go')
-rw-r--r-- | logger/logsystem.go | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/logger/logsystem.go b/logger/logsystem.go new file mode 100644 index 000000000..4dadb126e --- /dev/null +++ b/logger/logsystem.go @@ -0,0 +1,60 @@ +package logger + +import ( + "io" + "log" + "sync/atomic" +) + +// LogSystem is implemented by log output devices. +// All methods can be called concurrently from multiple goroutines. +type LogSystem interface { + LogPrint(LogMsg) +} + +// NewStdLogSystem creates a LogSystem that prints to the given writer. +// The flag values are defined package log. +func NewStdLogSystem(writer io.Writer, flags int, level LogLevel) *StdLogSystem { + logger := log.New(writer, "", flags) + return &StdLogSystem{logger, uint32(level)} +} + +type StdLogSystem struct { + logger *log.Logger + level uint32 +} + +func (t *StdLogSystem) LogPrint(msg LogMsg) { + stdmsg, ok := msg.(stdMsg) + if ok { + if t.GetLogLevel() >= stdmsg.Level() { + t.logger.Print(stdmsg.String()) + } + } +} + +func (t *StdLogSystem) SetLogLevel(i LogLevel) { + atomic.StoreUint32(&t.level, uint32(i)) +} + +func (t *StdLogSystem) GetLogLevel() LogLevel { + return LogLevel(atomic.LoadUint32(&t.level)) +} + +// NewJSONLogSystem creates a LogSystem that prints to the given writer without +// adding extra information irrespective of loglevel only if message is JSON type +func NewJsonLogSystem(writer io.Writer) LogSystem { + logger := log.New(writer, "", 0) + return &jsonLogSystem{logger} +} + +type jsonLogSystem struct { + logger *log.Logger +} + +func (t *jsonLogSystem) LogPrint(msg LogMsg) { + jsonmsg, ok := msg.(jsonMsg) + if ok { + t.logger.Print(jsonmsg.String()) + } +} |