log/logger.go

106 lines
2.3 KiB
Go

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
autotrace level
}
var loggers []loggerData = make([]loggerData, 1, 10)
func init() {
DefaultLogger.
SetLevel(INFO).
SetTarget(os.Stdout).
SetFormatter(&PlainFormatter{}).
SetAutotrace(DEBUG)
}
// 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) Autotrace() level {
return loggers[l].autotrace
}
// SetAutotrace sets the level to send the stack trace to in case an error is logged. (which is a
// log message with an error attached to it).
func (l logger) SetAutotrace(lvl level) logger {
loggers[l].autotrace = lvl
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
}