Golint fixed for modules/logtags/v1.21.12.1
| @@ -23,20 +23,20 @@ type ConnWriter struct { | |||||
| Level int `json:"level"` | Level int `json:"level"` | ||||
| } | } | ||||
| // create new ConnWrite returning as LoggerInterface. | |||||
| // NewConn creates new ConnWrite returning as LoggerInterface. | |||||
| func NewConn() LoggerInterface { | func NewConn() LoggerInterface { | ||||
| conn := new(ConnWriter) | conn := new(ConnWriter) | ||||
| conn.Level = TRACE | conn.Level = TRACE | ||||
| return conn | return conn | ||||
| } | } | ||||
| // init connection writer with json config. | |||||
| // Init inits connection writer with json config. | |||||
| // json config only need key "level". | // json config only need key "level". | ||||
| func (cw *ConnWriter) Init(jsonconfig string) error { | func (cw *ConnWriter) Init(jsonconfig string) error { | ||||
| return json.Unmarshal([]byte(jsonconfig), cw) | return json.Unmarshal([]byte(jsonconfig), cw) | ||||
| } | } | ||||
| // write message in connection. | |||||
| // WriteMsg writes message in connection. | |||||
| // if connection is down, try to re-connect. | // if connection is down, try to re-connect. | ||||
| func (cw *ConnWriter) WriteMsg(msg string, skip, level int) error { | func (cw *ConnWriter) WriteMsg(msg string, skip, level int) error { | ||||
| if cw.Level > level { | if cw.Level > level { | ||||
| @@ -55,10 +55,11 @@ func (cw *ConnWriter) WriteMsg(msg string, skip, level int) error { | |||||
| return nil | return nil | ||||
| } | } | ||||
| func (_ *ConnWriter) Flush() { | |||||
| // Flush no things for this implementation | |||||
| func (cw *ConnWriter) Flush() { | |||||
| } | } | ||||
| // destroy connection writer and close tcp listener. | |||||
| // Destroy destroy connection writer and close tcp listener. | |||||
| func (cw *ConnWriter) Destroy() { | func (cw *ConnWriter) Destroy() { | ||||
| if cw.innerWriter == nil { | if cw.innerWriter == nil { | ||||
| return | return | ||||
| @@ -11,8 +11,10 @@ import ( | |||||
| "runtime" | "runtime" | ||||
| ) | ) | ||||
| // Brush brush type | |||||
| type Brush func(string) string | type Brush func(string) string | ||||
| // NewBrush create a brush according color | |||||
| func NewBrush(color string) Brush { | func NewBrush(color string) Brush { | ||||
| pre := "\033[" | pre := "\033[" | ||||
| reset := "\033[0m" | reset := "\033[0m" | ||||
| @@ -37,7 +39,7 @@ type ConsoleWriter struct { | |||||
| Level int `json:"level"` | Level int `json:"level"` | ||||
| } | } | ||||
| // create ConsoleWriter returning as LoggerInterface. | |||||
| // NewConsole create ConsoleWriter returning as LoggerInterface. | |||||
| func NewConsole() LoggerInterface { | func NewConsole() LoggerInterface { | ||||
| return &ConsoleWriter{ | return &ConsoleWriter{ | ||||
| lg: log.New(os.Stdout, "", log.Ldate|log.Ltime), | lg: log.New(os.Stdout, "", log.Ldate|log.Ltime), | ||||
| @@ -45,10 +47,14 @@ func NewConsole() LoggerInterface { | |||||
| } | } | ||||
| } | } | ||||
| // Init inits connection writer with json config. | |||||
| // json config only need key "level". | |||||
| func (cw *ConsoleWriter) Init(config string) error { | func (cw *ConsoleWriter) Init(config string) error { | ||||
| return json.Unmarshal([]byte(config), cw) | return json.Unmarshal([]byte(config), cw) | ||||
| } | } | ||||
| // WriteMsg writes message in console. | |||||
| // if OS is windows, ignore colors. | |||||
| func (cw *ConsoleWriter) WriteMsg(msg string, skip, level int) error { | func (cw *ConsoleWriter) WriteMsg(msg string, skip, level int) error { | ||||
| if cw.Level > level { | if cw.Level > level { | ||||
| return nil | return nil | ||||
| @@ -61,11 +67,12 @@ func (cw *ConsoleWriter) WriteMsg(msg string, skip, level int) error { | |||||
| return nil | return nil | ||||
| } | } | ||||
| func (_ *ConsoleWriter) Flush() { | |||||
| // Flush when log should be flushed | |||||
| func (cw *ConsoleWriter) Flush() { | |||||
| } | } | ||||
| func (_ *ConsoleWriter) Destroy() { | |||||
| // Destroy when writer is destroy | |||||
| func (cw *ConsoleWriter) Destroy() { | |||||
| } | } | ||||
| func init() { | func init() { | ||||
| @@ -25,17 +25,17 @@ type FileLogWriter struct { | |||||
| // The opened file | // The opened file | ||||
| Filename string `json:"filename"` | Filename string `json:"filename"` | ||||
| Maxlines int `json:"maxlines"` | |||||
| maxlines_curlines int | |||||
| Maxlines int `json:"maxlines"` | |||||
| maxlinesCurlines int | |||||
| // Rotate at size | // Rotate at size | ||||
| Maxsize int `json:"maxsize"` | |||||
| maxsize_cursize int | |||||
| Maxsize int `json:"maxsize"` | |||||
| maxsizeCursize int | |||||
| // Rotate daily | // Rotate daily | ||||
| Daily bool `json:"daily"` | |||||
| Maxdays int64 `json:"maxdays"` | |||||
| daily_opendate int | |||||
| Daily bool `json:"daily"` | |||||
| Maxdays int64 `json:"maxdays"` | |||||
| dailyOpenDate int | |||||
| Rotate bool `json:"rotate"` | Rotate bool `json:"rotate"` | ||||
| @@ -44,20 +44,20 @@ type FileLogWriter struct { | |||||
| Level int `json:"level"` | Level int `json:"level"` | ||||
| } | } | ||||
| // an *os.File writer with locker. | |||||
| // MuxWriter an *os.File writer with locker. | |||||
| type MuxWriter struct { | type MuxWriter struct { | ||||
| sync.Mutex | sync.Mutex | ||||
| fd *os.File | fd *os.File | ||||
| } | } | ||||
| // write to os.File. | |||||
| // Write writes to os.File. | |||||
| func (l *MuxWriter) Write(b []byte) (int, error) { | func (l *MuxWriter) Write(b []byte) (int, error) { | ||||
| l.Lock() | l.Lock() | ||||
| defer l.Unlock() | defer l.Unlock() | ||||
| return l.fd.Write(b) | return l.fd.Write(b) | ||||
| } | } | ||||
| // set os.File in writer. | |||||
| // SetFd sets os.File in writer. | |||||
| func (l *MuxWriter) SetFd(fd *os.File) { | func (l *MuxWriter) SetFd(fd *os.File) { | ||||
| if l.fd != nil { | if l.fd != nil { | ||||
| l.fd.Close() | l.fd.Close() | ||||
| @@ -65,7 +65,7 @@ func (l *MuxWriter) SetFd(fd *os.File) { | |||||
| l.fd = fd | l.fd = fd | ||||
| } | } | ||||
| // create a FileLogWriter returning as LoggerInterface. | |||||
| // NewFileWriter create a FileLogWriter returning as LoggerInterface. | |||||
| func NewFileWriter() LoggerInterface { | func NewFileWriter() LoggerInterface { | ||||
| w := &FileLogWriter{ | w := &FileLogWriter{ | ||||
| Filename: "", | Filename: "", | ||||
| @@ -103,7 +103,7 @@ func (w *FileLogWriter) Init(config string) error { | |||||
| return w.StartLogger() | return w.StartLogger() | ||||
| } | } | ||||
| // start file logger. create log file and set to locker-inside file writer. | |||||
| // StartLogger start file logger. create log file and set to locker-inside file writer. | |||||
| func (w *FileLogWriter) StartLogger() error { | func (w *FileLogWriter) StartLogger() error { | ||||
| fd, err := w.createLogFile() | fd, err := w.createLogFile() | ||||
| if err != nil { | if err != nil { | ||||
| @@ -119,19 +119,19 @@ func (w *FileLogWriter) StartLogger() error { | |||||
| func (w *FileLogWriter) docheck(size int) { | func (w *FileLogWriter) docheck(size int) { | ||||
| w.startLock.Lock() | w.startLock.Lock() | ||||
| defer w.startLock.Unlock() | defer w.startLock.Unlock() | ||||
| if w.Rotate && ((w.Maxlines > 0 && w.maxlines_curlines >= w.Maxlines) || | |||||
| (w.Maxsize > 0 && w.maxsize_cursize >= w.Maxsize) || | |||||
| (w.Daily && time.Now().Day() != w.daily_opendate)) { | |||||
| if w.Rotate && ((w.Maxlines > 0 && w.maxlinesCurlines >= w.Maxlines) || | |||||
| (w.Maxsize > 0 && w.maxsizeCursize >= w.Maxsize) || | |||||
| (w.Daily && time.Now().Day() != w.dailyOpenDate)) { | |||||
| if err := w.DoRotate(); err != nil { | if err := w.DoRotate(); err != nil { | ||||
| fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err) | fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err) | ||||
| return | return | ||||
| } | } | ||||
| } | } | ||||
| w.maxlines_curlines++ | |||||
| w.maxsize_cursize += size | |||||
| w.maxlinesCurlines++ | |||||
| w.maxsizeCursize += size | |||||
| } | } | ||||
| // write logger message into file. | |||||
| // WriteMsg writes logger message into file. | |||||
| func (w *FileLogWriter) WriteMsg(msg string, skip, level int) error { | func (w *FileLogWriter) WriteMsg(msg string, skip, level int) error { | ||||
| if level < w.Level { | if level < w.Level { | ||||
| return nil | return nil | ||||
| @@ -151,18 +151,18 @@ func (w *FileLogWriter) initFd() error { | |||||
| fd := w.mw.fd | fd := w.mw.fd | ||||
| finfo, err := fd.Stat() | finfo, err := fd.Stat() | ||||
| if err != nil { | if err != nil { | ||||
| return fmt.Errorf("get stat: %s\n", err) | |||||
| return fmt.Errorf("get stat: %s", err) | |||||
| } | } | ||||
| w.maxsize_cursize = int(finfo.Size()) | |||||
| w.daily_opendate = time.Now().Day() | |||||
| w.maxsizeCursize = int(finfo.Size()) | |||||
| w.dailyOpenDate = time.Now().Day() | |||||
| if finfo.Size() > 0 { | if finfo.Size() > 0 { | ||||
| content, err := ioutil.ReadFile(w.Filename) | content, err := ioutil.ReadFile(w.Filename) | ||||
| if err != nil { | if err != nil { | ||||
| return err | return err | ||||
| } | } | ||||
| w.maxlines_curlines = len(strings.Split(string(content), "\n")) | |||||
| w.maxlinesCurlines = len(strings.Split(string(content), "\n")) | |||||
| } else { | } else { | ||||
| w.maxlines_curlines = 0 | |||||
| w.maxlinesCurlines = 0 | |||||
| } | } | ||||
| return nil | return nil | ||||
| } | } | ||||
| @@ -181,7 +181,7 @@ func (w *FileLogWriter) DoRotate() error { | |||||
| } | } | ||||
| // return error if the last file checked still existed | // return error if the last file checked still existed | ||||
| if err == nil { | if err == nil { | ||||
| return fmt.Errorf("rotate: cannot find free log number to rename %s\n", w.Filename) | |||||
| return fmt.Errorf("rotate: cannot find free log number to rename %s", w.Filename) | |||||
| } | } | ||||
| // block Logger's io.Writer | // block Logger's io.Writer | ||||
| @@ -194,12 +194,12 @@ func (w *FileLogWriter) DoRotate() error { | |||||
| // close fd before rename | // close fd before rename | ||||
| // Rename the file to its newfound home | // Rename the file to its newfound home | ||||
| if err = os.Rename(w.Filename, fname); err != nil { | if err = os.Rename(w.Filename, fname); err != nil { | ||||
| return fmt.Errorf("Rotate: %s\n", err) | |||||
| return fmt.Errorf("Rotate: %s", err) | |||||
| } | } | ||||
| // re-start logger | // re-start logger | ||||
| if err = w.StartLogger(); err != nil { | if err = w.StartLogger(); err != nil { | ||||
| return fmt.Errorf("Rotate StartLogger: %s\n", err) | |||||
| return fmt.Errorf("Rotate StartLogger: %s", err) | |||||
| } | } | ||||
| go w.deleteOldLog() | go w.deleteOldLog() | ||||
| @@ -226,12 +226,12 @@ func (w *FileLogWriter) deleteOldLog() { | |||||
| }) | }) | ||||
| } | } | ||||
| // destroy file logger, close file writer. | |||||
| // Destroy destroy file logger, close file writer. | |||||
| func (w *FileLogWriter) Destroy() { | func (w *FileLogWriter) Destroy() { | ||||
| w.mw.fd.Close() | w.mw.fd.Close() | ||||
| } | } | ||||
| // flush file logger. | |||||
| // Flush flush file logger. | |||||
| // there are no buffering messages in file logger in memory. | // there are no buffering messages in file logger in memory. | ||||
| // flush file means sync file from disk. | // flush file means sync file from disk. | ||||
| func (w *FileLogWriter) Flush() { | func (w *FileLogWriter) Flush() { | ||||
| @@ -15,10 +15,12 @@ import ( | |||||
| ) | ) | ||||
| var ( | var ( | ||||
| loggers []*Logger | |||||
| loggers []*Logger | |||||
| // GitLogger logger for git | |||||
| GitLogger *Logger | GitLogger *Logger | ||||
| ) | ) | ||||
| // NewLogger create a logger | |||||
| func NewLogger(bufLen int64, mode, config string) { | func NewLogger(bufLen int64, mode, config string) { | ||||
| logger := newLogger(bufLen) | logger := newLogger(bufLen) | ||||
| @@ -37,6 +39,7 @@ func NewLogger(bufLen int64, mode, config string) { | |||||
| } | } | ||||
| } | } | ||||
| // NewGitLogger create a logger for git | |||||
| // FIXME: use same log level as other loggers. | // FIXME: use same log level as other loggers. | ||||
| func NewGitLogger(logPath string) { | func NewGitLogger(logPath string) { | ||||
| os.MkdirAll(path.Dir(logPath), os.ModePerm) | os.MkdirAll(path.Dir(logPath), os.ModePerm) | ||||
| @@ -44,42 +47,49 @@ func NewGitLogger(logPath string) { | |||||
| GitLogger.SetLogger("file", fmt.Sprintf(`{"level":0,"filename":"%s","rotate":false}`, logPath)) | GitLogger.SetLogger("file", fmt.Sprintf(`{"level":0,"filename":"%s","rotate":false}`, logPath)) | ||||
| } | } | ||||
| // Trace records trace log | |||||
| func Trace(format string, v ...interface{}) { | func Trace(format string, v ...interface{}) { | ||||
| for _, logger := range loggers { | for _, logger := range loggers { | ||||
| logger.Trace(format, v...) | logger.Trace(format, v...) | ||||
| } | } | ||||
| } | } | ||||
| // Debug records debug log | |||||
| func Debug(format string, v ...interface{}) { | func Debug(format string, v ...interface{}) { | ||||
| for _, logger := range loggers { | for _, logger := range loggers { | ||||
| logger.Debug(format, v...) | logger.Debug(format, v...) | ||||
| } | } | ||||
| } | } | ||||
| // Info records info log | |||||
| func Info(format string, v ...interface{}) { | func Info(format string, v ...interface{}) { | ||||
| for _, logger := range loggers { | for _, logger := range loggers { | ||||
| logger.Info(format, v...) | logger.Info(format, v...) | ||||
| } | } | ||||
| } | } | ||||
| // Warn records warnning log | |||||
| func Warn(format string, v ...interface{}) { | func Warn(format string, v ...interface{}) { | ||||
| for _, logger := range loggers { | for _, logger := range loggers { | ||||
| logger.Warn(format, v...) | logger.Warn(format, v...) | ||||
| } | } | ||||
| } | } | ||||
| // Error records error log | |||||
| func Error(skip int, format string, v ...interface{}) { | func Error(skip int, format string, v ...interface{}) { | ||||
| for _, logger := range loggers { | for _, logger := range loggers { | ||||
| logger.Error(skip, format, v...) | logger.Error(skip, format, v...) | ||||
| } | } | ||||
| } | } | ||||
| // Critical records critical log | |||||
| func Critical(skip int, format string, v ...interface{}) { | func Critical(skip int, format string, v ...interface{}) { | ||||
| for _, logger := range loggers { | for _, logger := range loggers { | ||||
| logger.Critical(skip, format, v...) | logger.Critical(skip, format, v...) | ||||
| } | } | ||||
| } | } | ||||
| // Fatal records error log and exit process | |||||
| func Fatal(skip int, format string, v ...interface{}) { | func Fatal(skip int, format string, v ...interface{}) { | ||||
| Error(skip, format, v...) | Error(skip, format, v...) | ||||
| for _, l := range loggers { | for _, l := range loggers { | ||||
| @@ -88,6 +98,7 @@ func Fatal(skip int, format string, v ...interface{}) { | |||||
| os.Exit(1) | os.Exit(1) | ||||
| } | } | ||||
| // Close closes all the loggers | |||||
| func Close() { | func Close() { | ||||
| for _, l := range loggers { | for _, l := range loggers { | ||||
| l.Close() | l.Close() | ||||
| @@ -101,8 +112,10 @@ func Close() { | |||||
| // |___|___| /__| \___ >__| |__| (____ /\___ >___ > | // |___|___| /__| \___ >__| |__| (____ /\___ >___ > | ||||
| // \/ \/ \/ \/ \/ | // \/ \/ \/ \/ \/ | ||||
| type LogLevel int | |||||
| // LogLevel level type for log | |||||
| //type LogLevel int | |||||
| // log levels | |||||
| const ( | const ( | ||||
| TRACE = iota | TRACE = iota | ||||
| DEBUG | DEBUG | ||||
| @@ -274,36 +287,43 @@ func (l *Logger) Close() { | |||||
| } | } | ||||
| } | } | ||||
| // Trace records trace log | |||||
| func (l *Logger) Trace(format string, v ...interface{}) { | func (l *Logger) Trace(format string, v ...interface{}) { | ||||
| msg := fmt.Sprintf("[T] "+format, v...) | msg := fmt.Sprintf("[T] "+format, v...) | ||||
| l.writerMsg(0, TRACE, msg) | l.writerMsg(0, TRACE, msg) | ||||
| } | } | ||||
| // Debug records debug log | |||||
| func (l *Logger) Debug(format string, v ...interface{}) { | func (l *Logger) Debug(format string, v ...interface{}) { | ||||
| msg := fmt.Sprintf("[D] "+format, v...) | msg := fmt.Sprintf("[D] "+format, v...) | ||||
| l.writerMsg(0, DEBUG, msg) | l.writerMsg(0, DEBUG, msg) | ||||
| } | } | ||||
| // Info records information log | |||||
| func (l *Logger) Info(format string, v ...interface{}) { | func (l *Logger) Info(format string, v ...interface{}) { | ||||
| msg := fmt.Sprintf("[I] "+format, v...) | msg := fmt.Sprintf("[I] "+format, v...) | ||||
| l.writerMsg(0, INFO, msg) | l.writerMsg(0, INFO, msg) | ||||
| } | } | ||||
| // Warn records warnning log | |||||
| func (l *Logger) Warn(format string, v ...interface{}) { | func (l *Logger) Warn(format string, v ...interface{}) { | ||||
| msg := fmt.Sprintf("[W] "+format, v...) | msg := fmt.Sprintf("[W] "+format, v...) | ||||
| l.writerMsg(0, WARN, msg) | l.writerMsg(0, WARN, msg) | ||||
| } | } | ||||
| // Error records error log | |||||
| func (l *Logger) Error(skip int, format string, v ...interface{}) { | func (l *Logger) Error(skip int, format string, v ...interface{}) { | ||||
| msg := fmt.Sprintf("[E] "+format, v...) | msg := fmt.Sprintf("[E] "+format, v...) | ||||
| l.writerMsg(skip, ERROR, msg) | l.writerMsg(skip, ERROR, msg) | ||||
| } | } | ||||
| // Critical records critical log | |||||
| func (l *Logger) Critical(skip int, format string, v ...interface{}) { | func (l *Logger) Critical(skip int, format string, v ...interface{}) { | ||||
| msg := fmt.Sprintf("[C] "+format, v...) | msg := fmt.Sprintf("[C] "+format, v...) | ||||
| l.writerMsg(skip, CRITICAL, msg) | l.writerMsg(skip, CRITICAL, msg) | ||||
| } | } | ||||
| // Fatal records error log and exit the process | |||||
| func (l *Logger) Fatal(skip int, format string, v ...interface{}) { | func (l *Logger) Fatal(skip int, format string, v ...interface{}) { | ||||
| msg := fmt.Sprintf("[F] "+format, v...) | msg := fmt.Sprintf("[F] "+format, v...) | ||||
| l.writerMsg(skip, FATAL, msg) | l.writerMsg(skip, FATAL, msg) | ||||
| @@ -16,7 +16,7 @@ const ( | |||||
| subjectPhrase = "Diagnostic message from server" | subjectPhrase = "Diagnostic message from server" | ||||
| ) | ) | ||||
| // smtpWriter implements LoggerInterface and is used to send emails via given SMTP-server. | |||||
| // SMTPWriter implements LoggerInterface and is used to send emails via given SMTP-server. | |||||
| type SMTPWriter struct { | type SMTPWriter struct { | ||||
| Username string `json:"Username"` | Username string `json:"Username"` | ||||
| Password string `json:"password"` | Password string `json:"password"` | ||||
| @@ -26,12 +26,12 @@ type SMTPWriter struct { | |||||
| Level int `json:"level"` | Level int `json:"level"` | ||||
| } | } | ||||
| // create smtp writer. | |||||
| // NewSMTPWriter creates smtp writer. | |||||
| func NewSMTPWriter() LoggerInterface { | func NewSMTPWriter() LoggerInterface { | ||||
| return &SMTPWriter{Level: TRACE} | return &SMTPWriter{Level: TRACE} | ||||
| } | } | ||||
| // init smtp writer with json config. | |||||
| // Init smtp writer with json config. | |||||
| // config like: | // config like: | ||||
| // { | // { | ||||
| // "Username":"example@gmail.com", | // "Username":"example@gmail.com", | ||||
| @@ -45,41 +45,43 @@ func (sw *SMTPWriter) Init(jsonconfig string) error { | |||||
| return json.Unmarshal([]byte(jsonconfig), sw) | return json.Unmarshal([]byte(jsonconfig), sw) | ||||
| } | } | ||||
| // write message in smtp writer. | |||||
| // WriteMsg writes message in smtp writer. | |||||
| // it will send an email with subject and only this message. | // it will send an email with subject and only this message. | ||||
| func (s *SMTPWriter) WriteMsg(msg string, skip, level int) error { | |||||
| if level < s.Level { | |||||
| func (sw *SMTPWriter) WriteMsg(msg string, skip, level int) error { | |||||
| if level < sw.Level { | |||||
| return nil | return nil | ||||
| } | } | ||||
| hp := strings.Split(s.Host, ":") | |||||
| hp := strings.Split(sw.Host, ":") | |||||
| // Set up authentication information. | // Set up authentication information. | ||||
| auth := smtp.PlainAuth( | auth := smtp.PlainAuth( | ||||
| "", | "", | ||||
| s.Username, | |||||
| s.Password, | |||||
| sw.Username, | |||||
| sw.Password, | |||||
| hp[0], | hp[0], | ||||
| ) | ) | ||||
| // Connect to the server, authenticate, set the sender and recipient, | // Connect to the server, authenticate, set the sender and recipient, | ||||
| // and send the email all in one step. | // and send the email all in one step. | ||||
| content_type := "Content-Type: text/plain" + "; charset=UTF-8" | |||||
| mailmsg := []byte("To: " + strings.Join(s.RecipientAddresses, ";") + "\r\nFrom: " + s.Username + "<" + s.Username + | |||||
| ">\r\nSubject: " + s.Subject + "\r\n" + content_type + "\r\n\r\n" + fmt.Sprintf(".%s", time.Now().Format("2006-01-02 15:04:05")) + msg) | |||||
| contentType := "Content-Type: text/plain" + "; charset=UTF-8" | |||||
| mailmsg := []byte("To: " + strings.Join(sw.RecipientAddresses, ";") + "\r\nFrom: " + sw.Username + "<" + sw.Username + | |||||
| ">\r\nSubject: " + sw.Subject + "\r\n" + contentType + "\r\n\r\n" + fmt.Sprintf(".%s", time.Now().Format("2006-01-02 15:04:05")) + msg) | |||||
| return smtp.SendMail( | return smtp.SendMail( | ||||
| s.Host, | |||||
| sw.Host, | |||||
| auth, | auth, | ||||
| s.Username, | |||||
| s.RecipientAddresses, | |||||
| sw.Username, | |||||
| sw.RecipientAddresses, | |||||
| mailmsg, | mailmsg, | ||||
| ) | ) | ||||
| } | } | ||||
| func (_ *SMTPWriter) Flush() { | |||||
| // Flush when log should be flushed | |||||
| func (sw *SMTPWriter) Flush() { | |||||
| } | } | ||||
| func (_ *SMTPWriter) Destroy() { | |||||
| // Destroy when writer is destroy | |||||
| func (sw *SMTPWriter) Destroy() { | |||||
| } | } | ||||
| func init() { | func init() { | ||||