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  }