...
1 package utils
2
3 import (
4 "io"
5 "log"
6 "strings"
7 "time"
8 )
9
10 type Logger struct {
11 *log.Logger
12 formatTemplate string
13 isOpen bool
14 lastLogMsg string
15 }
16
17 var defaultLoggerTemplate = `{time} {channel}: "{method} {uri} HTTP/{version}" {code} {cost} {hostname}`
18 var loggerParam = []string{"{time}", "{start_time}", "{ts}", "{channel}", "{pid}", "{host}", "{method}", "{uri}", "{version}", "{target}", "{hostname}", "{code}", "{error}", "{req_headers}", "{res_body}", "{res_headers}", "{cost}"}
19 var logChannel string
20
21 func InitLogMsg(fieldMap map[string]string) {
22 for _, value := range loggerParam {
23 fieldMap[value] = ""
24 }
25 }
26
27 func (logger *Logger) SetFormatTemplate(template string) {
28 logger.formatTemplate = template
29
30 }
31
32 func (logger *Logger) GetFormatTemplate() string {
33 return logger.formatTemplate
34
35 }
36
37 func NewLogger(level string, channel string, out io.Writer, template string) *Logger {
38 if level == "" {
39 level = "info"
40 }
41
42 logChannel = "AlibabaCloud"
43 if channel != "" {
44 logChannel = channel
45 }
46 log := log.New(out, "["+strings.ToUpper(level)+"]", log.Lshortfile)
47 if template == "" {
48 template = defaultLoggerTemplate
49 }
50
51 return &Logger{
52 Logger: log,
53 formatTemplate: template,
54 isOpen: true,
55 }
56 }
57
58 func (logger *Logger) OpenLogger() {
59 logger.isOpen = true
60 }
61
62 func (logger *Logger) CloseLogger() {
63 logger.isOpen = false
64 }
65
66 func (logger *Logger) SetIsopen(isopen bool) {
67 logger.isOpen = isopen
68 }
69
70 func (logger *Logger) GetIsopen() bool {
71 return logger.isOpen
72 }
73
74 func (logger *Logger) SetLastLogMsg(lastLogMsg string) {
75 logger.lastLogMsg = lastLogMsg
76 }
77
78 func (logger *Logger) GetLastLogMsg() string {
79 return logger.lastLogMsg
80 }
81
82 func SetLogChannel(channel string) {
83 logChannel = channel
84 }
85
86 func (logger *Logger) PrintLog(fieldMap map[string]string, err error) {
87 if err != nil {
88 fieldMap["{error}"] = err.Error()
89 }
90 fieldMap["{time}"] = time.Now().Format("2006-01-02 15:04:05")
91 fieldMap["{ts}"] = getTimeInFormatISO8601()
92 fieldMap["{channel}"] = logChannel
93 if logger != nil {
94 logMsg := logger.formatTemplate
95 for key, value := range fieldMap {
96 logMsg = strings.Replace(logMsg, key, value, -1)
97 }
98 logger.lastLogMsg = logMsg
99 if logger.isOpen == true {
100 logger.Output(2, logMsg)
101 }
102 }
103 }
104
105 func getTimeInFormatISO8601() (timeStr string) {
106 gmt := time.FixedZone("GMT", 0)
107
108 return time.Now().In(gmt).Format("2006-01-02T15:04:05Z")
109 }
110
View as plain text