Golint fixed for modules/logtags/v1.0.0
@@ -23,20 +23,20 @@ type ConnWriter struct { | |||
Level int `json:"level"` | |||
} | |||
// create new ConnWrite returning as LoggerInterface. | |||
// NewConn creates new ConnWrite returning as LoggerInterface. | |||
func NewConn() LoggerInterface { | |||
conn := new(ConnWriter) | |||
conn.Level = TRACE | |||
return conn | |||
} | |||
// init connection writer with json config. | |||
// Init inits connection writer with json config. | |||
// json config only need key "level". | |||
func (cw *ConnWriter) Init(jsonconfig string) error { | |||
return json.Unmarshal([]byte(jsonconfig), cw) | |||
} | |||
// write message in connection. | |||
// WriteMsg writes message in connection. | |||
// if connection is down, try to re-connect. | |||
func (cw *ConnWriter) WriteMsg(msg string, skip, level int) error { | |||
if cw.Level > level { | |||
@@ -55,10 +55,11 @@ func (cw *ConnWriter) WriteMsg(msg string, skip, level int) error { | |||
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() { | |||
if cw.innerWriter == nil { | |||
return |
@@ -11,8 +11,10 @@ import ( | |||
"runtime" | |||
) | |||
// Brush brush type | |||
type Brush func(string) string | |||
// NewBrush create a brush according color | |||
func NewBrush(color string) Brush { | |||
pre := "\033[" | |||
reset := "\033[0m" | |||
@@ -37,7 +39,7 @@ type ConsoleWriter struct { | |||
Level int `json:"level"` | |||
} | |||
// create ConsoleWriter returning as LoggerInterface. | |||
// NewConsole create ConsoleWriter returning as LoggerInterface. | |||
func NewConsole() LoggerInterface { | |||
return &ConsoleWriter{ | |||
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 { | |||
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 { | |||
if cw.Level > level { | |||
return nil | |||
@@ -61,11 +67,12 @@ func (cw *ConsoleWriter) WriteMsg(msg string, skip, level int) error { | |||
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() { |
@@ -25,17 +25,17 @@ type FileLogWriter struct { | |||
// The opened file | |||
Filename string `json:"filename"` | |||
Maxlines int `json:"maxlines"` | |||
maxlines_curlines int | |||
Maxlines int `json:"maxlines"` | |||
maxlinesCurlines int | |||
// Rotate at size | |||
Maxsize int `json:"maxsize"` | |||
maxsize_cursize int | |||
Maxsize int `json:"maxsize"` | |||
maxsizeCursize int | |||
// 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"` | |||
@@ -44,20 +44,20 @@ type FileLogWriter struct { | |||
Level int `json:"level"` | |||
} | |||
// an *os.File writer with locker. | |||
// MuxWriter an *os.File writer with locker. | |||
type MuxWriter struct { | |||
sync.Mutex | |||
fd *os.File | |||
} | |||
// write to os.File. | |||
// Write writes to os.File. | |||
func (l *MuxWriter) Write(b []byte) (int, error) { | |||
l.Lock() | |||
defer l.Unlock() | |||
return l.fd.Write(b) | |||
} | |||
// set os.File in writer. | |||
// SetFd sets os.File in writer. | |||
func (l *MuxWriter) SetFd(fd *os.File) { | |||
if l.fd != nil { | |||
l.fd.Close() | |||
@@ -65,7 +65,7 @@ func (l *MuxWriter) SetFd(fd *os.File) { | |||
l.fd = fd | |||
} | |||
// create a FileLogWriter returning as LoggerInterface. | |||
// NewFileWriter create a FileLogWriter returning as LoggerInterface. | |||
func NewFileWriter() LoggerInterface { | |||
w := &FileLogWriter{ | |||
Filename: "", | |||
@@ -103,7 +103,7 @@ func (w *FileLogWriter) Init(config string) error { | |||
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 { | |||
fd, err := w.createLogFile() | |||
if err != nil { | |||
@@ -119,19 +119,19 @@ func (w *FileLogWriter) StartLogger() error { | |||
func (w *FileLogWriter) docheck(size int) { | |||
w.startLock.Lock() | |||
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 { | |||
fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err) | |||
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 { | |||
if level < w.Level { | |||
return nil | |||
@@ -151,18 +151,18 @@ func (w *FileLogWriter) initFd() error { | |||
fd := w.mw.fd | |||
finfo, err := fd.Stat() | |||
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 { | |||
content, err := ioutil.ReadFile(w.Filename) | |||
if err != nil { | |||
return err | |||
} | |||
w.maxlines_curlines = len(strings.Split(string(content), "\n")) | |||
w.maxlinesCurlines = len(strings.Split(string(content), "\n")) | |||
} else { | |||
w.maxlines_curlines = 0 | |||
w.maxlinesCurlines = 0 | |||
} | |||
return nil | |||
} | |||
@@ -181,7 +181,7 @@ func (w *FileLogWriter) DoRotate() error { | |||
} | |||
// return error if the last file checked still existed | |||
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 | |||
@@ -194,12 +194,12 @@ func (w *FileLogWriter) DoRotate() error { | |||
// close fd before rename | |||
// Rename the file to its newfound home | |||
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 | |||
if err = w.StartLogger(); err != nil { | |||
return fmt.Errorf("Rotate StartLogger: %s\n", err) | |||
return fmt.Errorf("Rotate StartLogger: %s", err) | |||
} | |||
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() { | |||
w.mw.fd.Close() | |||
} | |||
// flush file logger. | |||
// Flush flush file logger. | |||
// there are no buffering messages in file logger in memory. | |||
// flush file means sync file from disk. | |||
func (w *FileLogWriter) Flush() { |
@@ -15,10 +15,12 @@ import ( | |||
) | |||
var ( | |||
loggers []*Logger | |||
loggers []*Logger | |||
// GitLogger logger for git | |||
GitLogger *Logger | |||
) | |||
// NewLogger create a logger | |||
func NewLogger(bufLen int64, mode, config string) { | |||
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. | |||
func NewGitLogger(logPath string) { | |||
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)) | |||
} | |||
// Trace records trace log | |||
func Trace(format string, v ...interface{}) { | |||
for _, logger := range loggers { | |||
logger.Trace(format, v...) | |||
} | |||
} | |||
// Debug records debug log | |||
func Debug(format string, v ...interface{}) { | |||
for _, logger := range loggers { | |||
logger.Debug(format, v...) | |||
} | |||
} | |||
// Info records info log | |||
func Info(format string, v ...interface{}) { | |||
for _, logger := range loggers { | |||
logger.Info(format, v...) | |||
} | |||
} | |||
// Warn records warnning log | |||
func Warn(format string, v ...interface{}) { | |||
for _, logger := range loggers { | |||
logger.Warn(format, v...) | |||
} | |||
} | |||
// Error records error log | |||
func Error(skip int, format string, v ...interface{}) { | |||
for _, logger := range loggers { | |||
logger.Error(skip, format, v...) | |||
} | |||
} | |||
// Critical records critical log | |||
func Critical(skip int, format string, v ...interface{}) { | |||
for _, logger := range loggers { | |||
logger.Critical(skip, format, v...) | |||
} | |||
} | |||
// Fatal records error log and exit process | |||
func Fatal(skip int, format string, v ...interface{}) { | |||
Error(skip, format, v...) | |||
for _, l := range loggers { | |||
@@ -88,6 +98,7 @@ func Fatal(skip int, format string, v ...interface{}) { | |||
os.Exit(1) | |||
} | |||
// Close closes all the loggers | |||
func Close() { | |||
for _, l := range loggers { | |||
l.Close() | |||
@@ -101,8 +112,10 @@ func Close() { | |||
// |___|___| /__| \___ >__| |__| (____ /\___ >___ > | |||
// \/ \/ \/ \/ \/ | |||
type LogLevel int | |||
// LogLevel level type for log | |||
//type LogLevel int | |||
// log levels | |||
const ( | |||
TRACE = iota | |||
DEBUG | |||
@@ -274,36 +287,43 @@ func (l *Logger) Close() { | |||
} | |||
} | |||
// Trace records trace log | |||
func (l *Logger) Trace(format string, v ...interface{}) { | |||
msg := fmt.Sprintf("[T] "+format, v...) | |||
l.writerMsg(0, TRACE, msg) | |||
} | |||
// Debug records debug log | |||
func (l *Logger) Debug(format string, v ...interface{}) { | |||
msg := fmt.Sprintf("[D] "+format, v...) | |||
l.writerMsg(0, DEBUG, msg) | |||
} | |||
// Info records information log | |||
func (l *Logger) Info(format string, v ...interface{}) { | |||
msg := fmt.Sprintf("[I] "+format, v...) | |||
l.writerMsg(0, INFO, msg) | |||
} | |||
// Warn records warnning log | |||
func (l *Logger) Warn(format string, v ...interface{}) { | |||
msg := fmt.Sprintf("[W] "+format, v...) | |||
l.writerMsg(0, WARN, msg) | |||
} | |||
// Error records error log | |||
func (l *Logger) Error(skip int, format string, v ...interface{}) { | |||
msg := fmt.Sprintf("[E] "+format, v...) | |||
l.writerMsg(skip, ERROR, msg) | |||
} | |||
// Critical records critical log | |||
func (l *Logger) Critical(skip int, format string, v ...interface{}) { | |||
msg := fmt.Sprintf("[C] "+format, v...) | |||
l.writerMsg(skip, CRITICAL, msg) | |||
} | |||
// Fatal records error log and exit the process | |||
func (l *Logger) Fatal(skip int, format string, v ...interface{}) { | |||
msg := fmt.Sprintf("[F] "+format, v...) | |||
l.writerMsg(skip, FATAL, msg) |
@@ -16,7 +16,7 @@ const ( | |||
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 { | |||
Username string `json:"Username"` | |||
Password string `json:"password"` | |||
@@ -26,12 +26,12 @@ type SMTPWriter struct { | |||
Level int `json:"level"` | |||
} | |||
// create smtp writer. | |||
// NewSMTPWriter creates smtp writer. | |||
func NewSMTPWriter() LoggerInterface { | |||
return &SMTPWriter{Level: TRACE} | |||
} | |||
// init smtp writer with json config. | |||
// Init smtp writer with json config. | |||
// config like: | |||
// { | |||
// "Username":"example@gmail.com", | |||
@@ -45,41 +45,43 @@ func (sw *SMTPWriter) Init(jsonconfig string) error { | |||
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. | |||
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 | |||
} | |||
hp := strings.Split(s.Host, ":") | |||
hp := strings.Split(sw.Host, ":") | |||
// Set up authentication information. | |||
auth := smtp.PlainAuth( | |||
"", | |||
s.Username, | |||
s.Password, | |||
sw.Username, | |||
sw.Password, | |||
hp[0], | |||
) | |||
// Connect to the server, authenticate, set the sender and recipient, | |||
// 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( | |||
s.Host, | |||
sw.Host, | |||
auth, | |||
s.Username, | |||
s.RecipientAddresses, | |||
sw.Username, | |||
sw.RecipientAddresses, | |||
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() { |