/
logger.go
executable file
·107 lines (93 loc) · 2.12 KB
/
logger.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package logger
import (
"fmt"
"github.com/codingXiang/configer/v2"
"github.com/sirupsen/logrus"
"github.com/snowzach/rotatefilehook"
"github.com/spf13/viper"
"log"
"os"
"runtime"
"strings"
)
const (
LOG = "log"
LEVEL = "level"
MAX_AGE = "maxAge"
FORMAT = "format"
FILENAME = "filename"
PATH = "path"
)
var Log *Logger
func init() {
Log = Default()
}
type Logger struct {
config *viper.Viper
*logrus.Logger
}
func New(config *viper.Viper) *Logger {
var (
l = new(Logger)
)
l.config = config
l.Logger = newLogger(config)
l.Output(config)
l.Info(fmt.Sprintf("log level = %s", l.GetLevel().String()))
return l
}
func Default() *Logger {
c := configer.NewCoreWithData(configer.YAML, defaultConfig)
if config, err := c.ReadConfig(); err == nil {
return New(config)
} else {
panic(err)
}
}
func newLogger(config *viper.Viper) *logrus.Logger {
var (
logger = logrus.New()
level = config.GetString(GetConfigPath(LOG, LEVEL))
format = config.GetString(GetConfigPath(LOG, FORMAT))
)
logger.SetFormatter(&logrus.TextFormatter{})
logger.SetOutput(os.Stdout)
logger.SetLevel(NewLevel(level).Get())
logger.SetFormatter(NewFormat(format).Get())
return logger
}
func (l *Logger) Output(config *viper.Viper) {
var (
path = config.GetString(GetConfigPath(LOG, PATH))
name = config.GetString(GetConfigPath(LOG, FILENAME))
maxAge = config.GetInt(GetConfigPath(LOG, MAX_AGE))
)
if err := os.MkdirAll(path, 0777); err != nil {
log.Fatalf("create log folder error: %v", err)
}
filename := path + GetPathSymbol() + name
rotateFileHook, err := rotatefilehook.NewRotateFileHook(rotatefilehook.RotateFileConfig{
Filename: filename,
MaxSize: 50, // megabytes
MaxBackups: 3,
MaxAge: maxAge, //days
Level: l.GetLevel(),
Formatter: l.Formatter,
})
if err != nil {
log.Fatalf("open log file error: %v", err)
}
l.SetOutput(os.Stdout)
l.AddHook(rotateFileHook)
}
func GetConfigPath(key string, path ...string) string {
return key + "." + strings.Join(path, ".")
}
func GetPathSymbol() string {
switch runtime.GOOS {
case "windows":
return "\\"
default:
return "/"
}
}