eea27248 by astaxie

Merge pull request #425 from fuxiaohei/master

add comments in logs package.
2 parents 412a4a04 94ad13c8
...@@ -140,7 +140,7 @@ func (c *Controller) RenderString() (string, error) { ...@@ -140,7 +140,7 @@ func (c *Controller) RenderString() (string, error) {
140 return string(b), e 140 return string(b), e
141 } 141 }
142 142
143 // RenderBytes returns the bytes of renderd tempate string. Do not send out response. 143 // RenderBytes returns the bytes of rendered template string. Do not send out response.
144 func (c *Controller) RenderBytes() ([]byte, error) { 144 func (c *Controller) RenderBytes() ([]byte, error) {
145 //if the controller has set layout, then first get the tplname's content set the content to the layout 145 //if the controller has set layout, then first get the tplname's content set the content to the layout
146 if c.Layout != "" { 146 if c.Layout != "" {
......
...@@ -7,6 +7,8 @@ import ( ...@@ -7,6 +7,8 @@ import (
7 "net" 7 "net"
8 ) 8 )
9 9
10 // ConnWriter implements LoggerInterface.
11 // it writes messages in keep-live tcp connection.
10 type ConnWriter struct { 12 type ConnWriter struct {
11 lg *log.Logger 13 lg *log.Logger
12 innerWriter io.WriteCloser 14 innerWriter io.WriteCloser
...@@ -17,12 +19,15 @@ type ConnWriter struct { ...@@ -17,12 +19,15 @@ type ConnWriter struct {
17 Level int `json:"level"` 19 Level int `json:"level"`
18 } 20 }
19 21
22 // create new ConnWrite returning as LoggerInterface.
20 func NewConn() LoggerInterface { 23 func NewConn() LoggerInterface {
21 conn := new(ConnWriter) 24 conn := new(ConnWriter)
22 conn.Level = LevelTrace 25 conn.Level = LevelTrace
23 return conn 26 return conn
24 } 27 }
25 28
29 // init connection writer with json config.
30 // json config only need key "level".
26 func (c *ConnWriter) Init(jsonconfig string) error { 31 func (c *ConnWriter) Init(jsonconfig string) error {
27 err := json.Unmarshal([]byte(jsonconfig), c) 32 err := json.Unmarshal([]byte(jsonconfig), c)
28 if err != nil { 33 if err != nil {
...@@ -31,6 +36,8 @@ func (c *ConnWriter) Init(jsonconfig string) error { ...@@ -31,6 +36,8 @@ func (c *ConnWriter) Init(jsonconfig string) error {
31 return nil 36 return nil
32 } 37 }
33 38
39 // write message in connection.
40 // if connection is down, try to re-connect.
34 func (c *ConnWriter) WriteMsg(msg string, level int) error { 41 func (c *ConnWriter) WriteMsg(msg string, level int) error {
35 if level < c.Level { 42 if level < c.Level {
36 return nil 43 return nil
...@@ -49,10 +56,12 @@ func (c *ConnWriter) WriteMsg(msg string, level int) error { ...@@ -49,10 +56,12 @@ func (c *ConnWriter) WriteMsg(msg string, level int) error {
49 return nil 56 return nil
50 } 57 }
51 58
59 // implementing method. empty.
52 func (c *ConnWriter) Flush() { 60 func (c *ConnWriter) Flush() {
53 61
54 } 62 }
55 63
64 // destroy connection writer and close tcp listener.
56 func (c *ConnWriter) Destroy() { 65 func (c *ConnWriter) Destroy() {
57 if c.innerWriter == nil { 66 if c.innerWriter == nil {
58 return 67 return
......
...@@ -6,11 +6,13 @@ import ( ...@@ -6,11 +6,13 @@ import (
6 "os" 6 "os"
7 ) 7 )
8 8
9 // ConsoleWriter implements LoggerInterface and writes messages to terminal.
9 type ConsoleWriter struct { 10 type ConsoleWriter struct {
10 lg *log.Logger 11 lg *log.Logger
11 Level int `json:"level"` 12 Level int `json:"level"`
12 } 13 }
13 14
15 // create ConsoleWriter returning as LoggerInterface.
14 func NewConsole() LoggerInterface { 16 func NewConsole() LoggerInterface {
15 cw := new(ConsoleWriter) 17 cw := new(ConsoleWriter)
16 cw.lg = log.New(os.Stdout, "", log.Ldate|log.Ltime) 18 cw.lg = log.New(os.Stdout, "", log.Ldate|log.Ltime)
...@@ -18,6 +20,8 @@ func NewConsole() LoggerInterface { ...@@ -18,6 +20,8 @@ func NewConsole() LoggerInterface {
18 return cw 20 return cw
19 } 21 }
20 22
23 // init console logger.
24 // jsonconfig like '{"level":LevelTrace}'.
21 func (c *ConsoleWriter) Init(jsonconfig string) error { 25 func (c *ConsoleWriter) Init(jsonconfig string) error {
22 err := json.Unmarshal([]byte(jsonconfig), c) 26 err := json.Unmarshal([]byte(jsonconfig), c)
23 if err != nil { 27 if err != nil {
...@@ -26,6 +30,7 @@ func (c *ConsoleWriter) Init(jsonconfig string) error { ...@@ -26,6 +30,7 @@ func (c *ConsoleWriter) Init(jsonconfig string) error {
26 return nil 30 return nil
27 } 31 }
28 32
33 // write message in console.
29 func (c *ConsoleWriter) WriteMsg(msg string, level int) error { 34 func (c *ConsoleWriter) WriteMsg(msg string, level int) error {
30 if level < c.Level { 35 if level < c.Level {
31 return nil 36 return nil
...@@ -34,10 +39,12 @@ func (c *ConsoleWriter) WriteMsg(msg string, level int) error { ...@@ -34,10 +39,12 @@ func (c *ConsoleWriter) WriteMsg(msg string, level int) error {
34 return nil 39 return nil
35 } 40 }
36 41
42 // implementing method. empty.
37 func (c *ConsoleWriter) Destroy() { 43 func (c *ConsoleWriter) Destroy() {
38 44
39 } 45 }
40 46
47 // implementing method. empty.
41 func (c *ConsoleWriter) Flush() { 48 func (c *ConsoleWriter) Flush() {
42 49
43 } 50 }
......
...@@ -13,6 +13,8 @@ import ( ...@@ -13,6 +13,8 @@ import (
13 "time" 13 "time"
14 ) 14 )
15 15
16 // FileLogWriter implements LoggerInterface.
17 // It writes messages by lines limit, file size limit, or time frequency.
16 type FileLogWriter struct { 18 type FileLogWriter struct {
17 *log.Logger 19 *log.Logger
18 mw *MuxWriter 20 mw *MuxWriter
...@@ -38,17 +40,20 @@ type FileLogWriter struct { ...@@ -38,17 +40,20 @@ type FileLogWriter struct {
38 Level int `json:"level"` 40 Level int `json:"level"`
39 } 41 }
40 42
43 // an *os.File writer with locker.
41 type MuxWriter struct { 44 type MuxWriter struct {
42 sync.Mutex 45 sync.Mutex
43 fd *os.File 46 fd *os.File
44 } 47 }
45 48
49 // write to os.File.
46 func (l *MuxWriter) Write(b []byte) (int, error) { 50 func (l *MuxWriter) Write(b []byte) (int, error) {
47 l.Lock() 51 l.Lock()
48 defer l.Unlock() 52 defer l.Unlock()
49 return l.fd.Write(b) 53 return l.fd.Write(b)
50 } 54 }
51 55
56 // set os.File in writer.
52 func (l *MuxWriter) SetFd(fd *os.File) { 57 func (l *MuxWriter) SetFd(fd *os.File) {
53 if l.fd != nil { 58 if l.fd != nil {
54 l.fd.Close() 59 l.fd.Close()
...@@ -56,6 +61,7 @@ func (l *MuxWriter) SetFd(fd *os.File) { ...@@ -56,6 +61,7 @@ func (l *MuxWriter) SetFd(fd *os.File) {
56 l.fd = fd 61 l.fd = fd
57 } 62 }
58 63
64 // create a FileLogWriter returning as LoggerInterface.
59 func NewFileWriter() LoggerInterface { 65 func NewFileWriter() LoggerInterface {
60 w := &FileLogWriter{ 66 w := &FileLogWriter{
61 Filename: "", 67 Filename: "",
...@@ -73,15 +79,16 @@ func NewFileWriter() LoggerInterface { ...@@ -73,15 +79,16 @@ func NewFileWriter() LoggerInterface {
73 return w 79 return w
74 } 80 }
75 81
76 // jsonconfig like this 82 // Init file logger with json config.
77 //{ 83 // jsonconfig like:
84 // {
78 // "filename":"logs/beego.log", 85 // "filename":"logs/beego.log",
79 // "maxlines":10000, 86 // "maxlines":10000,
80 // "maxsize":1<<30, 87 // "maxsize":1<<30,
81 // "daily":true, 88 // "daily":true,
82 // "maxdays":15, 89 // "maxdays":15,
83 // "rotate":true 90 // "rotate":true
84 //} 91 // }
85 func (w *FileLogWriter) Init(jsonconfig string) error { 92 func (w *FileLogWriter) Init(jsonconfig string) error {
86 err := json.Unmarshal([]byte(jsonconfig), w) 93 err := json.Unmarshal([]byte(jsonconfig), w)
87 if err != nil { 94 if err != nil {
...@@ -94,6 +101,7 @@ func (w *FileLogWriter) Init(jsonconfig string) error { ...@@ -94,6 +101,7 @@ func (w *FileLogWriter) Init(jsonconfig string) error {
94 return err 101 return err
95 } 102 }
96 103
104 // start file logger. create log file and set to locker-inside file writer.
97 func (w *FileLogWriter) StartLogger() error { 105 func (w *FileLogWriter) StartLogger() error {
98 fd, err := w.createLogFile() 106 fd, err := w.createLogFile()
99 if err != nil { 107 if err != nil {
...@@ -122,6 +130,7 @@ func (w *FileLogWriter) docheck(size int) { ...@@ -122,6 +130,7 @@ func (w *FileLogWriter) docheck(size int) {
122 w.maxsize_cursize += size 130 w.maxsize_cursize += size
123 } 131 }
124 132
133 // write logger message into file.
125 func (w *FileLogWriter) WriteMsg(msg string, level int) error { 134 func (w *FileLogWriter) WriteMsg(msg string, level int) error {
126 if level < w.Level { 135 if level < w.Level {
127 return nil 136 return nil
...@@ -158,6 +167,8 @@ func (w *FileLogWriter) initFd() error { ...@@ -158,6 +167,8 @@ func (w *FileLogWriter) initFd() error {
158 return nil 167 return nil
159 } 168 }
160 169
170 // DoRotate means it need to write file in new file.
171 // new file name like xx.log.2013-01-01.2
161 func (w *FileLogWriter) DoRotate() error { 172 func (w *FileLogWriter) DoRotate() error {
162 _, err := os.Lstat(w.Filename) 173 _, err := os.Lstat(w.Filename)
163 if err == nil { // file exists 174 if err == nil { // file exists
...@@ -211,10 +222,14 @@ func (w *FileLogWriter) deleteOldLog() { ...@@ -211,10 +222,14 @@ func (w *FileLogWriter) deleteOldLog() {
211 }) 222 })
212 } 223 }
213 224
225 // destroy file logger, close file writer.
214 func (w *FileLogWriter) Destroy() { 226 func (w *FileLogWriter) Destroy() {
215 w.mw.fd.Close() 227 w.mw.fd.Close()
216 } 228 }
217 229
230 // flush file logger.
231 // there are no buffering messages in file logger in memory.
232 // flush file means sync file from disk.
218 func (w *FileLogWriter) Flush() { 233 func (w *FileLogWriter) Flush() {
219 w.mw.fd.Sync() 234 w.mw.fd.Sync()
220 } 235 }
......
...@@ -6,6 +6,7 @@ import ( ...@@ -6,6 +6,7 @@ import (
6 ) 6 )
7 7
8 const ( 8 const (
9 // log message levels
9 LevelTrace = iota 10 LevelTrace = iota
10 LevelDebug 11 LevelDebug
11 LevelInfo 12 LevelInfo
...@@ -16,6 +17,7 @@ const ( ...@@ -16,6 +17,7 @@ const (
16 17
17 type loggerType func() LoggerInterface 18 type loggerType func() LoggerInterface
18 19
20 // LoggerInterface defines the behavior of a log provider.
19 type LoggerInterface interface { 21 type LoggerInterface interface {
20 Init(config string) error 22 Init(config string) error
21 WriteMsg(msg string, level int) error 23 WriteMsg(msg string, level int) error
...@@ -38,6 +40,8 @@ func Register(name string, log loggerType) { ...@@ -38,6 +40,8 @@ func Register(name string, log loggerType) {
38 adapters[name] = log 40 adapters[name] = log
39 } 41 }
40 42
43 // BeeLogger is default logger in beego application.
44 // it can contain several providers and log message into all providers.
41 type BeeLogger struct { 45 type BeeLogger struct {
42 lock sync.Mutex 46 lock sync.Mutex
43 level int 47 level int
...@@ -50,7 +54,9 @@ type logMsg struct { ...@@ -50,7 +54,9 @@ type logMsg struct {
50 msg string 54 msg string
51 } 55 }
52 56
53 // config need to be correct JSON as string: {"interval":360} 57 // NewLogger returns a new BeeLogger.
58 // channellen means the number of messages in chan.
59 // if the buffering chan is full, logger adapters write to file or other way.
54 func NewLogger(channellen int64) *BeeLogger { 60 func NewLogger(channellen int64) *BeeLogger {
55 bl := new(BeeLogger) 61 bl := new(BeeLogger)
56 bl.msg = make(chan *logMsg, channellen) 62 bl.msg = make(chan *logMsg, channellen)
...@@ -60,6 +66,8 @@ func NewLogger(channellen int64) *BeeLogger { ...@@ -60,6 +66,8 @@ func NewLogger(channellen int64) *BeeLogger {
60 return bl 66 return bl
61 } 67 }
62 68
69 // SetLogger provides a given logger adapter into BeeLogger with config string.
70 // config need to be correct JSON as string: {"interval":360}.
63 func (bl *BeeLogger) SetLogger(adaptername string, config string) error { 71 func (bl *BeeLogger) SetLogger(adaptername string, config string) error {
64 bl.lock.Lock() 72 bl.lock.Lock()
65 defer bl.lock.Unlock() 73 defer bl.lock.Unlock()
...@@ -73,6 +81,7 @@ func (bl *BeeLogger) SetLogger(adaptername string, config string) error { ...@@ -73,6 +81,7 @@ func (bl *BeeLogger) SetLogger(adaptername string, config string) error {
73 } 81 }
74 } 82 }
75 83
84 // remove a logger adapter in BeeLogger.
76 func (bl *BeeLogger) DelLogger(adaptername string) error { 85 func (bl *BeeLogger) DelLogger(adaptername string) error {
77 bl.lock.Lock() 86 bl.lock.Lock()
78 defer bl.lock.Unlock() 87 defer bl.lock.Unlock()
...@@ -96,10 +105,14 @@ func (bl *BeeLogger) writerMsg(loglevel int, msg string) error { ...@@ -96,10 +105,14 @@ func (bl *BeeLogger) writerMsg(loglevel int, msg string) error {
96 return nil 105 return nil
97 } 106 }
98 107
108 // set log message level.
109 // if message level (such as LevelTrace) is less than logger level (such as LevelWarn), ignore message.
99 func (bl *BeeLogger) SetLevel(l int) { 110 func (bl *BeeLogger) SetLevel(l int) {
100 bl.level = l 111 bl.level = l
101 } 112 }
102 113
114 // start logger chan reading.
115 // when chan is full, write logs.
103 func (bl *BeeLogger) StartLogger() { 116 func (bl *BeeLogger) StartLogger() {
104 for { 117 for {
105 select { 118 select {
...@@ -111,43 +124,50 @@ func (bl *BeeLogger) StartLogger() { ...@@ -111,43 +124,50 @@ func (bl *BeeLogger) StartLogger() {
111 } 124 }
112 } 125 }
113 126
127 // log trace level message.
114 func (bl *BeeLogger) Trace(format string, v ...interface{}) { 128 func (bl *BeeLogger) Trace(format string, v ...interface{}) {
115 msg := fmt.Sprintf("[T] "+format, v...) 129 msg := fmt.Sprintf("[T] "+format, v...)
116 bl.writerMsg(LevelTrace, msg) 130 bl.writerMsg(LevelTrace, msg)
117 } 131 }
118 132
133 // log debug level message.
119 func (bl *BeeLogger) Debug(format string, v ...interface{}) { 134 func (bl *BeeLogger) Debug(format string, v ...interface{}) {
120 msg := fmt.Sprintf("[D] "+format, v...) 135 msg := fmt.Sprintf("[D] "+format, v...)
121 bl.writerMsg(LevelDebug, msg) 136 bl.writerMsg(LevelDebug, msg)
122 } 137 }
123 138
139 // log info level message.
124 func (bl *BeeLogger) Info(format string, v ...interface{}) { 140 func (bl *BeeLogger) Info(format string, v ...interface{}) {
125 msg := fmt.Sprintf("[I] "+format, v...) 141 msg := fmt.Sprintf("[I] "+format, v...)
126 bl.writerMsg(LevelInfo, msg) 142 bl.writerMsg(LevelInfo, msg)
127 } 143 }
128 144
145 // log warn level message.
129 func (bl *BeeLogger) Warn(format string, v ...interface{}) { 146 func (bl *BeeLogger) Warn(format string, v ...interface{}) {
130 msg := fmt.Sprintf("[W] "+format, v...) 147 msg := fmt.Sprintf("[W] "+format, v...)
131 bl.writerMsg(LevelWarn, msg) 148 bl.writerMsg(LevelWarn, msg)
132 } 149 }
133 150
151 // log error level message.
134 func (bl *BeeLogger) Error(format string, v ...interface{}) { 152 func (bl *BeeLogger) Error(format string, v ...interface{}) {
135 msg := fmt.Sprintf("[E] "+format, v...) 153 msg := fmt.Sprintf("[E] "+format, v...)
136 bl.writerMsg(LevelError, msg) 154 bl.writerMsg(LevelError, msg)
137 } 155 }
138 156
157 // log critical level message.
139 func (bl *BeeLogger) Critical(format string, v ...interface{}) { 158 func (bl *BeeLogger) Critical(format string, v ...interface{}) {
140 msg := fmt.Sprintf("[C] "+format, v...) 159 msg := fmt.Sprintf("[C] "+format, v...)
141 bl.writerMsg(LevelCritical, msg) 160 bl.writerMsg(LevelCritical, msg)
142 } 161 }
143 162
144 //flush all chan data 163 // flush all chan data.
145 func (bl *BeeLogger) Flush() { 164 func (bl *BeeLogger) Flush() {
146 for _, l := range bl.outputs { 165 for _, l := range bl.outputs {
147 l.Flush() 166 l.Flush()
148 } 167 }
149 } 168 }
150 169
170 // close logger, flush all chan data and destroy all adapters in BeeLogger.
151 func (bl *BeeLogger) Close() { 171 func (bl *BeeLogger) Close() {
152 for { 172 for {
153 if len(bl.msg) > 0 { 173 if len(bl.msg) > 0 {
......
...@@ -12,7 +12,7 @@ const ( ...@@ -12,7 +12,7 @@ const (
12 subjectPhrase = "Diagnostic message from server" 12 subjectPhrase = "Diagnostic message from server"
13 ) 13 )
14 14
15 // smtpWriter is used to send emails via given SMTP-server. 15 // smtpWriter implements LoggerInterface and is used to send emails via given SMTP-server.
16 type SmtpWriter struct { 16 type SmtpWriter struct {
17 Username string `json:"Username"` 17 Username string `json:"Username"`
18 Password string `json:"password"` 18 Password string `json:"password"`
...@@ -22,10 +22,21 @@ type SmtpWriter struct { ...@@ -22,10 +22,21 @@ type SmtpWriter struct {
22 Level int `json:"level"` 22 Level int `json:"level"`
23 } 23 }
24 24
25 // create smtp writer.
25 func NewSmtpWriter() LoggerInterface { 26 func NewSmtpWriter() LoggerInterface {
26 return &SmtpWriter{Level: LevelTrace} 27 return &SmtpWriter{Level: LevelTrace}
27 } 28 }
28 29
30 // init smtp writer with json config.
31 // config like:
32 // {
33 // "Username":"example@gmail.com",
34 // "password:"password",
35 // "host":"smtp.gmail.com:465",
36 // "subject":"email title",
37 // "sendTos":["email1","email2"],
38 // "level":LevelError
39 // }
29 func (s *SmtpWriter) Init(jsonconfig string) error { 40 func (s *SmtpWriter) Init(jsonconfig string) error {
30 err := json.Unmarshal([]byte(jsonconfig), s) 41 err := json.Unmarshal([]byte(jsonconfig), s)
31 if err != nil { 42 if err != nil {
...@@ -34,6 +45,8 @@ func (s *SmtpWriter) Init(jsonconfig string) error { ...@@ -34,6 +45,8 @@ func (s *SmtpWriter) Init(jsonconfig string) error {
34 return nil 45 return nil
35 } 46 }
36 47
48 // write message in smtp writer.
49 // it will send an email with subject and only this message.
37 func (s *SmtpWriter) WriteMsg(msg string, level int) error { 50 func (s *SmtpWriter) WriteMsg(msg string, level int) error {
38 if level < s.Level { 51 if level < s.Level {
39 return nil 52 return nil
...@@ -65,9 +78,12 @@ func (s *SmtpWriter) WriteMsg(msg string, level int) error { ...@@ -65,9 +78,12 @@ func (s *SmtpWriter) WriteMsg(msg string, level int) error {
65 return err 78 return err
66 } 79 }
67 80
81 // implementing method. empty.
68 func (s *SmtpWriter) Flush() { 82 func (s *SmtpWriter) Flush() {
69 return 83 return
70 } 84 }
85
86 // implementing method. empty.
71 func (s *SmtpWriter) Destroy() { 87 func (s *SmtpWriter) Destroy() {
72 return 88 return
73 } 89 }
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!