github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/core/logger/loggers.go (about) 1 // Copyright 2022 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package logger 5 6 import "io" 7 8 const ( 9 SyslogName = "syslog" 10 DatabaseName = "database" 11 ) 12 13 // LoggerCloser is a Logger that can be closed. 14 type LoggerCloser interface { 15 Logger 16 io.Closer 17 } 18 19 // LoggersConfig defines a set of loggers that can be used to construct the 20 // final loggers. 21 type LoggersConfig struct { 22 SysLogger func() Logger 23 DBLogger func() Logger 24 } 25 26 // MakeLoggers creates loggers from a given LoggersConfig. 27 func MakeLoggers(outputs []string, config LoggersConfig) LoggerCloser { 28 results := make(map[string]Logger) 29 loop: 30 for _, output := range outputs { 31 switch output { 32 case SyslogName: 33 results[SyslogName] = config.SysLogger() 34 default: 35 // We only ever want one db logger. 36 if _, ok := results[DatabaseName]; ok { 37 continue loop 38 } 39 results[DatabaseName] = config.DBLogger() 40 } 41 } 42 resultSlice := make([]Logger, 0, len(results)) 43 for _, output := range results { 44 resultSlice = append(resultSlice, output) 45 } 46 return NewTeeLogger(resultSlice...) 47 }