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 }