github.com/sijibomii/docker@v0.0.0-20231230191044-5cf6ca554647/daemon/logger/factory.go (about) 1 package logger 2 3 import ( 4 "fmt" 5 "sync" 6 ) 7 8 // Creator builds a logging driver instance with given context. 9 type Creator func(Context) (Logger, error) 10 11 // LogOptValidator checks the options specific to the underlying 12 // logging implementation. 13 type LogOptValidator func(cfg map[string]string) error 14 15 type logdriverFactory struct { 16 registry map[string]Creator 17 optValidator map[string]LogOptValidator 18 m sync.Mutex 19 } 20 21 func (lf *logdriverFactory) register(name string, c Creator) error { 22 lf.m.Lock() 23 defer lf.m.Unlock() 24 25 if _, ok := lf.registry[name]; ok { 26 return fmt.Errorf("logger: log driver named '%s' is already registered", name) 27 } 28 lf.registry[name] = c 29 return nil 30 } 31 32 func (lf *logdriverFactory) registerLogOptValidator(name string, l LogOptValidator) error { 33 lf.m.Lock() 34 defer lf.m.Unlock() 35 36 if _, ok := lf.optValidator[name]; ok { 37 return fmt.Errorf("logger: log validator named '%s' is already registered", name) 38 } 39 lf.optValidator[name] = l 40 return nil 41 } 42 43 func (lf *logdriverFactory) get(name string) (Creator, error) { 44 lf.m.Lock() 45 defer lf.m.Unlock() 46 47 c, ok := lf.registry[name] 48 if !ok { 49 return c, fmt.Errorf("logger: no log driver named '%s' is registered", name) 50 } 51 return c, nil 52 } 53 54 func (lf *logdriverFactory) getLogOptValidator(name string) LogOptValidator { 55 lf.m.Lock() 56 defer lf.m.Unlock() 57 58 c, _ := lf.optValidator[name] 59 return c 60 } 61 62 var factory = &logdriverFactory{registry: make(map[string]Creator), optValidator: make(map[string]LogOptValidator)} // global factory instance 63 64 // RegisterLogDriver registers the given logging driver builder with given logging 65 // driver name. 66 func RegisterLogDriver(name string, c Creator) error { 67 return factory.register(name, c) 68 } 69 70 // RegisterLogOptValidator registers the logging option validator with 71 // the given logging driver name. 72 func RegisterLogOptValidator(name string, l LogOptValidator) error { 73 return factory.registerLogOptValidator(name, l) 74 } 75 76 // GetLogDriver provides the logging driver builder for a logging driver name. 77 func GetLogDriver(name string) (Creator, error) { 78 return factory.get(name) 79 } 80 81 // ValidateLogOpts checks the options for the given log driver. The 82 // options supported are specific to the LogDriver implementation. 83 func ValidateLogOpts(name string, cfg map[string]string) error { 84 l := factory.getLogOptValidator(name) 85 if l != nil { 86 return l(cfg) 87 } 88 return nil 89 }