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 }