github.com/tompao/docker@v1.9.1/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  }