diff --git a/logger.go b/logger.go index c0e27e6..fccc391 100644 --- a/logger.go +++ b/logger.go @@ -2,25 +2,34 @@ package logging import ( "fmt" + "log" "os" ) type Logger struct { + name string level Level backends []Backend } -func NewLogger() (l *Logger) { +func NewLogger(name string) (l *Logger) { l = &Logger{ + name: name, level: DEFAULT_LEVEL, } return } +// Add a new Backend to the logger func (l *Logger) AddBackend(b Backend) { l.backends = append(l.backends, b) } +// Sets the backend list to the logger. Any existing backend will be lost +func (l *Logger) SetBackend(b ...Backend) { + l.backends = b +} + func (l *Logger) SetLevel(level Level) { l.level = level for _, backend := range l.backends { @@ -28,8 +37,24 @@ func (l *Logger) SetLevel(level Level) { } } +type buffer struct { + level Level + logger *Logger +} + +func (b *buffer) Write(p []byte) (n int, err error) { + b.logger.Log(b.level, string(p)) + return len(p), nil +} + +func (l *Logger) AsStdLog(level Level) *log.Logger { + stdLogger := log.New(&buffer{logger: l, level: level}, "", 0) + + return stdLogger +} + func (l *Logger) Log(level Level, m string) { - r := NewRecord(level, m) + r := NewRecord(l.name, level, m) for _, backend := range l.backends { if r.Level >= backend.Level() { backend.Write(r) diff --git a/logging.go b/logging.go index cd63eb3..a479a2b 100644 --- a/logging.go +++ b/logging.go @@ -6,7 +6,7 @@ import ( "strings" ) -var logger *Logger +var loggers map[string]*Logger type Level byte @@ -37,19 +37,34 @@ func LevelByName(l string) (Level, error) { type Formatter func(*Record) string -func GetLogger() (l *Logger) { - return logger +func GetLogger(name string) (l *Logger) { + if name == "" { + name = "default" + } + l, ok := loggers[name] + if !ok { + l = NewLogger(name) + backend := NewStdoutBackend() + l.AddBackend(backend) + l.SetLevel(DEBUG) + loggers[name] = l + } + return l } var defaultFormatter Formatter = func(r *Record) string { - return fmt.Sprintf("%s [%s] %s\n", - r.Timestamp.Format("2006/01/02 15:04:05"), r.Level.Name(), + return fmt.Sprintf("%s [%s] %s: %s\n", + r.Timestamp.Format("2006/01/02 15:04:05"), r.Level.Name(), r.Logger, strings.TrimSpace(r.Message)) } func init() { - logger = NewLogger() + loggers = make(map[string]*Logger, 3) + + logger := NewLogger("default") backend := NewStdoutBackend() logger.AddBackend(backend) logger.SetLevel(DEBUG) + + loggers["default"] = logger } diff --git a/record.go b/record.go index 02dbc81..56a3768 100644 --- a/record.go +++ b/record.go @@ -5,13 +5,15 @@ import ( ) type Record struct { + Logger string Timestamp time.Time Level Level Message string } -func NewRecord(l Level, m string) (r *Record) { +func NewRecord(name string, l Level, m string) (r *Record) { r = &Record{ + Logger: name, Level: l, Message: m, Timestamp: time.Now(),