Skip to content

Commit 70ec50c

Browse files
authored
Add the function CreateLoggerFromConfig to create a logger from the config file (#33)
1 parent e638745 commit 70ec50c

File tree

6 files changed

+161
-1
lines changed

6 files changed

+161
-1
lines changed

builder.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package log
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strings"
7+
8+
"github.com/no-src/log/level"
9+
"gopkg.in/yaml.v3"
10+
)
11+
12+
const (
13+
consoleLoggerType = "console"
14+
fileLoggerType = "file"
15+
emptyLoggerType = "empty"
16+
)
17+
18+
// CreateLoggerFromConfig create a logger from config file
19+
func CreateLoggerFromConfig(configFile string) (Logger, error) {
20+
data, err := os.ReadFile(configFile)
21+
if err != nil {
22+
return nil, err
23+
}
24+
var conf config
25+
err = yaml.Unmarshal(data, &conf)
26+
if err != nil {
27+
return nil, err
28+
}
29+
return createLoggers(conf.Loggers)
30+
}
31+
32+
func createLoggers(configs []loggerConfig) (Logger, error) {
33+
var loggers []Logger
34+
for _, logConf := range configs {
35+
logger, err := createLogger(logConf)
36+
if err != nil {
37+
return nil, err
38+
}
39+
loggers = append(loggers, logger)
40+
}
41+
length := len(loggers)
42+
if length == 0 {
43+
return NewEmptyLogger(), nil
44+
} else if length == 1 {
45+
return loggers[0], nil
46+
} else {
47+
return NewMultiLogger(loggers...), nil
48+
}
49+
}
50+
51+
func createLogger(logConf loggerConfig) (Logger, error) {
52+
var logger Logger
53+
loggerType := strings.ToLower(logConf.Type)
54+
switch loggerType {
55+
case consoleLoggerType:
56+
lvl, err := level.ParseLevel(logConf.Level)
57+
if err != nil {
58+
return nil, err
59+
}
60+
logger = NewConsoleLogger(lvl)
61+
case fileLoggerType:
62+
opt, err := toFileLoggerOption(logConf)
63+
if err != nil {
64+
return nil, err
65+
}
66+
fl, err := NewFileLoggerWithOption(opt)
67+
if err != nil {
68+
return nil, err
69+
}
70+
logger = fl
71+
case emptyLoggerType:
72+
logger = NewEmptyLogger()
73+
default:
74+
return nil, fmt.Errorf("unsupported logger type: %s", logConf.Type)
75+
}
76+
77+
if loggerType != emptyLoggerType && logger != nil && logConf.Sample < 1 {
78+
logger = NewDefaultSampleLogger(logger, logConf.Sample)
79+
}
80+
return logger, nil
81+
}

builder_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package log
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestCreateLoggerFromConfig(t *testing.T) {
8+
logger, err := CreateLoggerFromConfig("./testdata/conf.yaml")
9+
if err != nil {
10+
t.Fatal(err)
11+
}
12+
InitDefaultLogger(logger)
13+
defer Close()
14+
testLogs(t)
15+
}

config.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package log
2+
3+
import (
4+
"time"
5+
6+
"github.com/no-src/log/level"
7+
"github.com/no-src/log/option"
8+
)
9+
10+
type config struct {
11+
Loggers []loggerConfig `yaml:"loggers"`
12+
}
13+
14+
type loggerConfig struct {
15+
// common fields
16+
Name string `yaml:"name"`
17+
Type string `yaml:"type"`
18+
Level string `yaml:"level"`
19+
Format string `yaml:"format"`
20+
TimeFormat string `yaml:"time-format"`
21+
Sample float64 `yaml:"sample"`
22+
23+
// file logger fields
24+
LogDir string `yaml:"log-dir"`
25+
LogFilePrefix string `yaml:"log-file-prefix"`
26+
AutoFlush bool `yaml:"auto-flush"`
27+
AutoFlushInterval time.Duration `yaml:"auto-flush-interval"`
28+
SplitByDate bool `yaml:"split-by-date"`
29+
}
30+
31+
func toFileLoggerOption(logConf loggerConfig) (opt option.FileLoggerOption, err error) {
32+
lvl, err := level.ParseLevel(logConf.Level)
33+
if err != nil {
34+
return opt, err
35+
}
36+
opt = option.NewFileLoggerOption(lvl, logConf.LogDir, logConf.LogFilePrefix, logConf.AutoFlush, logConf.AutoFlushInterval, logConf.SplitByDate)
37+
return opt, nil
38+
}

go.mod

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
module github.com/no-src/log
22

3-
go 1.19
3+
go 1.19
4+
5+
require gopkg.in/yaml.v3 v3.0.1

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
2+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
3+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
4+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

testdata/conf.yaml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
loggers:
2+
- name: "console logger"
3+
type: "console"
4+
level: "debug"
5+
format: "text"
6+
time-format: "2006-01-02 15:04:05"
7+
sample: 1
8+
- name: "file logger"
9+
type: "file"
10+
level: "info"
11+
format: "json"
12+
time-format: "2006-01-02 15:04:05"
13+
log-dir: "./logs"
14+
log-file-prefix: "conf_logger_"
15+
auto-flush: true
16+
auto-flush-interval: 3s
17+
split-by-date: true
18+
sample: 0.5
19+
- name: "empty logger"
20+
type: "empty"

0 commit comments

Comments
 (0)