support for named loggers and Loggers can be exported as stdlib loggers

This commit is contained in:
Bruno Carlin 2014-08-18 13:03:24 +02:00
parent ac19778676
commit 294692d146
3 changed files with 51 additions and 9 deletions

View file

@ -2,25 +2,34 @@ package logging
import ( import (
"fmt" "fmt"
"log"
"os" "os"
) )
type Logger struct { type Logger struct {
name string
level Level level Level
backends []Backend backends []Backend
} }
func NewLogger() (l *Logger) { func NewLogger(name string) (l *Logger) {
l = &Logger{ l = &Logger{
name: name,
level: DEFAULT_LEVEL, level: DEFAULT_LEVEL,
} }
return return
} }
// Add a new Backend to the logger
func (l *Logger) AddBackend(b Backend) { func (l *Logger) AddBackend(b Backend) {
l.backends = append(l.backends, b) 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) { func (l *Logger) SetLevel(level Level) {
l.level = level l.level = level
for _, backend := range l.backends { 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) { func (l *Logger) Log(level Level, m string) {
r := NewRecord(level, m) r := NewRecord(l.name, level, m)
for _, backend := range l.backends { for _, backend := range l.backends {
if r.Level >= backend.Level() { if r.Level >= backend.Level() {
backend.Write(r) backend.Write(r)

View file

@ -6,7 +6,7 @@ import (
"strings" "strings"
) )
var logger *Logger var loggers map[string]*Logger
type Level byte type Level byte
@ -37,19 +37,34 @@ func LevelByName(l string) (Level, error) {
type Formatter func(*Record) string type Formatter func(*Record) string
func GetLogger() (l *Logger) { func GetLogger(name string) (l *Logger) {
return 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 { var defaultFormatter Formatter = func(r *Record) string {
return fmt.Sprintf("%s [%s] %s\n", return fmt.Sprintf("%s [%s] %s: %s\n",
r.Timestamp.Format("2006/01/02 15:04:05"), r.Level.Name(), r.Timestamp.Format("2006/01/02 15:04:05"), r.Level.Name(), r.Logger,
strings.TrimSpace(r.Message)) strings.TrimSpace(r.Message))
} }
func init() { func init() {
logger = NewLogger() loggers = make(map[string]*Logger, 3)
logger := NewLogger("default")
backend := NewStdoutBackend() backend := NewStdoutBackend()
logger.AddBackend(backend) logger.AddBackend(backend)
logger.SetLevel(DEBUG) logger.SetLevel(DEBUG)
loggers["default"] = logger
} }

View file

@ -5,13 +5,15 @@ import (
) )
type Record struct { type Record struct {
Logger string
Timestamp time.Time Timestamp time.Time
Level Level Level Level
Message string Message string
} }
func NewRecord(l Level, m string) (r *Record) { func NewRecord(name string, l Level, m string) (r *Record) {
r = &Record{ r = &Record{
Logger: name,
Level: l, Level: l,
Message: m, Message: m,
Timestamp: time.Now(), Timestamp: time.Now(),