65 lines
1.8 KiB
Go
65 lines
1.8 KiB
Go
// Copyright 2013, Örjan Persson. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package logging
|
|
|
|
// TODO remove Level stuff from the multi logger. Do one thing.
|
|
|
|
// multiLogger is a log multiplexer which can be used to utilize multiple log
|
|
// backends at once.
|
|
type multiLogger struct {
|
|
backends []LeveledBackend
|
|
}
|
|
|
|
// MultiLogger creates a logger which contain multiple loggers.
|
|
func MultiLogger(backends ...Backend) LeveledBackend {
|
|
var leveledBackends []LeveledBackend
|
|
for _, backend := range backends {
|
|
leveledBackends = append(leveledBackends, AddModuleLevel(backend))
|
|
}
|
|
return &multiLogger{leveledBackends}
|
|
}
|
|
|
|
// Log passes the log record to all backends.
|
|
func (b *multiLogger) Log(level Level, calldepth int, rec *Record) (err error) {
|
|
for _, backend := range b.backends {
|
|
if backend.IsEnabledFor(level, rec.Module) {
|
|
// Shallow copy of the record for the formatted cache on Record and get the
|
|
// record formatter from the backend.
|
|
r2 := *rec
|
|
if e := backend.Log(level, calldepth+1, &r2); e != nil {
|
|
err = e
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
// GetLevel returns the highest level enabled by all backends.
|
|
func (b *multiLogger) GetLevel(module string) Level {
|
|
var level Level
|
|
for _, backend := range b.backends {
|
|
if backendLevel := backend.GetLevel(module); backendLevel > level {
|
|
level = backendLevel
|
|
}
|
|
}
|
|
return level
|
|
}
|
|
|
|
// SetLevel propagates the same level to all backends.
|
|
func (b *multiLogger) SetLevel(level Level, module string) {
|
|
for _, backend := range b.backends {
|
|
backend.SetLevel(level, module)
|
|
}
|
|
}
|
|
|
|
// IsEnabledFor returns true if any of the backends are enabled for it.
|
|
func (b *multiLogger) IsEnabledFor(level Level, module string) bool {
|
|
for _, backend := range b.backends {
|
|
if backend.IsEnabledFor(level, module) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|