summaryrefslogtreecommitdiff
path: root/internal/io/dlog/loggers/factory.go
blob: a5cc7cfe0212e389a57d69c5a553bbc4d30e73e4 (plain)
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
package loggers

import (
	"fmt"
	"strings"
	"sync"
)

var factoryMap map[string]Logger
var factoryMutex sync.Mutex

// Factory is there to retrieve a logger based on various settings.
func Factory(sourceName, loggerName string, logRotation Strategy) Logger {
	factoryMutex.Lock()
	defer factoryMutex.Unlock()

	id := fmt.Sprintf("sourceName:%s,fileBase:%s,loggerName:%s", sourceName,
		logRotation.FileBase, loggerName)
	if factoryMap == nil {
		factoryMap = make(map[string]Logger)
	}

	singleton, ok := factoryMap[id]
	if !ok {
		switch strings.ToLower(loggerName) {
		case "none":
			singleton = none{}
		case "stdout":
			singleton = newStdout()
			factoryMap[id] = singleton
		case "file":
			singleton = newFile(logRotation)
			factoryMap[id] = singleton
		case "fout":
			singleton = newFout(logRotation)
			factoryMap[id] = singleton
		default:
			panic(fmt.Sprintf("Unsupported logger type '%s'", loggerName))
		}
	}
	return singleton
}

// FactoryRotate invokes a log rotation of all loggers.
func FactoryRotate() {
	factoryMutex.Lock()
	defer factoryMutex.Unlock()
	if factoryMap == nil {
		return
	}
	for _, logger := range factoryMap {
		logger.Rotate()
	}
}