-
Notifications
You must be signed in to change notification settings - Fork 50
/
handler.go
56 lines (42 loc) · 1.49 KB
/
handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package log
import (
"fmt"
"time"
"github.com/justtrackio/gosoline/pkg/cfg"
)
type Handler interface {
Channels() []string
Level() int
Log(timestamp time.Time, level int, msg string, args []interface{}, err error, data Data) error
}
type HandlerFactory func(config cfg.Config, name string) (Handler, error)
var handlerFactories = map[string]HandlerFactory{}
func AddHandlerFactory(typ string, factory HandlerFactory) {
handlerFactories[typ] = factory
}
func NewHandlersFromConfig(config cfg.Config) ([]Handler, error) {
settings := &LoggerSettings{}
config.UnmarshalKey("log", settings)
var i int
var ok bool
var err error
var handlerFactory HandlerFactory
handlers := make([]Handler, len(settings.Handlers))
for name, handlerSettings := range settings.Handlers {
if handlerFactory, ok = handlerFactories[handlerSettings.Type]; !ok {
return nil, fmt.Errorf("there is no logging handler of type %s", handlerSettings.Type)
}
if handlers[i], err = handlerFactory(config, name); err != nil {
return nil, fmt.Errorf("can not create logging handler of type %s on index %d: %w", handlerSettings.Type, i, err)
}
i++
}
return handlers, nil
}
func UnmarshalHandlerSettingsFromConfig(config cfg.Config, name string, settings interface{}) {
handlerConfigKey := getHandlerConfigKey(name)
config.UnmarshalKey(handlerConfigKey, settings, cfg.UnmarshalWithDefaultsFromKey("log.level", "level"))
}
func getHandlerConfigKey(name string) string {
return fmt.Sprintf("log.handlers.%s", name)
}