mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
3a8728b431
- noplog driver pkg for '--log-driver=none' (null object pattern) - centralized factory for log drivers (instead of case/switch) - logging drivers registers themselves to factory upon import (easy plug/unplug of drivers in daemon/logdrivers.go) - daemon now doesn't start with an invalid log driver - Name() method of loggers is actually now their cli names (made it useful) - generalized Read() logic, made it unsupported except json-file (preserves existing behavior) Spotted some duplication code around processing of legacy json-file format, didn't touch that and refactored in both places. Signed-off-by: Ahmet Alp Balkan <ahmetalpbalkan@gmail.com>
56 lines
1.3 KiB
Go
56 lines
1.3 KiB
Go
package logger
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
)
|
|
|
|
// Creator is a method that builds a logging driver instance with given context
|
|
type Creator func(Context) (Logger, error)
|
|
|
|
// Context provides enough information for a logging driver to do its function
|
|
type Context struct {
|
|
ContainerID string
|
|
ContainerName string
|
|
LogPath string
|
|
}
|
|
|
|
type logdriverFactory struct {
|
|
registry map[string]Creator
|
|
m sync.Mutex
|
|
}
|
|
|
|
func (lf *logdriverFactory) register(name string, c Creator) error {
|
|
lf.m.Lock()
|
|
defer lf.m.Unlock()
|
|
|
|
if _, ok := lf.registry[name]; ok {
|
|
return fmt.Errorf("logger: log driver named '%s' is already registered", name)
|
|
}
|
|
lf.registry[name] = c
|
|
return nil
|
|
}
|
|
|
|
func (lf *logdriverFactory) get(name string) (Creator, error) {
|
|
lf.m.Lock()
|
|
defer lf.m.Unlock()
|
|
|
|
c, ok := lf.registry[name]
|
|
if !ok {
|
|
return c, fmt.Errorf("logger: no log driver named '%s' is registered", name)
|
|
}
|
|
return c, nil
|
|
}
|
|
|
|
var factory = &logdriverFactory{registry: make(map[string]Creator)} // global factory instance
|
|
|
|
// RegisterLogDriver registers the given logging driver builder with given logging
|
|
// driver name.
|
|
func RegisterLogDriver(name string, c Creator) error {
|
|
return factory.register(name, c)
|
|
}
|
|
|
|
// GetLogDriver provides the logging driver builder for a logging driver name.
|
|
func GetLogDriver(name string) (Creator, error) {
|
|
return factory.get(name)
|
|
}
|