github.com/squaremo/docker@v1.3.2-0.20150516120342-42cfc9554972/daemon/logger/factory.go (about)

     1  package logger
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  )
     7  
     8  // Creator is a method that builds a logging driver instance with given context
     9  type Creator func(Context) (Logger, error)
    10  
    11  // Context provides enough information for a logging driver to do its function
    12  type Context struct {
    13  	ContainerID   string
    14  	ContainerName string
    15  	LogPath       string
    16  }
    17  
    18  type logdriverFactory struct {
    19  	registry map[string]Creator
    20  	m        sync.Mutex
    21  }
    22  
    23  func (lf *logdriverFactory) register(name string, c Creator) error {
    24  	lf.m.Lock()
    25  	defer lf.m.Unlock()
    26  
    27  	if _, ok := lf.registry[name]; ok {
    28  		return fmt.Errorf("logger: log driver named '%s' is already registered", name)
    29  	}
    30  	lf.registry[name] = c
    31  	return nil
    32  }
    33  
    34  func (lf *logdriverFactory) get(name string) (Creator, error) {
    35  	lf.m.Lock()
    36  	defer lf.m.Unlock()
    37  
    38  	c, ok := lf.registry[name]
    39  	if !ok {
    40  		return c, fmt.Errorf("logger: no log driver named '%s' is registered", name)
    41  	}
    42  	return c, nil
    43  }
    44  
    45  var factory = &logdriverFactory{registry: make(map[string]Creator)} // global factory instance
    46  
    47  // RegisterLogDriver registers the given logging driver builder with given logging
    48  // driver name.
    49  func RegisterLogDriver(name string, c Creator) error {
    50  	return factory.register(name, c)
    51  }
    52  
    53  // GetLogDriver provides the logging driver builder for a logging driver name.
    54  func GetLogDriver(name string) (Creator, error) {
    55  	return factory.get(name)
    56  }