log/logger.go

92 lines
2.0 KiB
Go
Raw Normal View History

2024-01-08 10:51:00 +01:00
package log
import (
"io"
"os"
)
// logger is just an index into the loggers pool.
type logger int
const DefaultLogger logger = 0
// loggers is the pool of available loggers. The first entry always is empty,
// describing the default logger.
//var loggers []string = make([]string, 1, 10)
//var levels []level = make([]level, 1, 10)
//var targets []io.Writer = make([]io.Writer, 1, 10)
type loggerData struct {
name string
level level
target io.Writer
format Formatter
}
var loggers []loggerData = make([]loggerData, 1, 10)
func init() {
DefaultLogger.SetLevel(INFO)
DefaultLogger.SetTarget(os.Stdout)
DefaultLogger.SetFormatter(&PlainFormatter{})
}
// Logger returns a logger with the given name. If there is no logger with this
// name, a new one will be created.
func Logger(name string) logger {
for i, v := range loggers {
if v.name == name {
return logger(i)
}
}
loggers = append(loggers, loggerData{
name: name,
level: INFO,
target: os.Stdout,
format: &PlainFormatter{},
})
return logger(len(loggers) - 1)
}
// Level returns the log level this logger is set to.
func (l logger) Level() level {
return loggers[l].level
}
// SetLevel sets the log level for this logger. Returns the logger, which enables chaining during initialization.
func (l logger) SetLevel(lvl level) logger {
loggers[l].level = lvl
return l
}
func (l logger) Target() io.Writer {
return loggers[l].target
}
// SetTarget sets the logging target. Returns the logger, which enables chaining during initialization.
func (l logger) SetTarget(t io.Writer) logger {
loggers[l].target = t
return l
}
func (l logger) Formatter() Formatter {
return loggers[l].format
}
func (l logger) SetFormatter(f Formatter) logger {
loggers[l].format = f
return l
}
func (l logger) String() string {
return loggers[l].name
}
// Configure parses a config string, enabling the configuration of multiple loggers at once.
// [logger:]level[@target][#format]
// target may be a file name
func Configure(config string) error {
return nil
}