// 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 }