factory.go 2.6 KB

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