support for named loggers and Loggers can be exported as stdlib loggers
This commit is contained in:
parent
ac19778676
commit
294692d146
3 changed files with 51 additions and 9 deletions
29
logger.go
29
logger.go
|
@ -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)
|
||||||
|
|
27
logging.go
27
logging.go
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
Loading…
Reference in a new issue