Merge pull request #425 from fuxiaohei/master
add comments in logs package.
Showing
6 changed files
with
74 additions
and
7 deletions
| ... | @@ -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 | } | ... | ... |
-
Please register or sign in to post a comment