diff --git a/filelog.go b/filelog.go index 0cec0e3..a186018 100644 --- a/filelog.go +++ b/filelog.go @@ -4,6 +4,7 @@ import ( "bufio" "bytes" "fmt" + "io" "os" "path/filepath" "sync" @@ -67,11 +68,11 @@ func (w *mFileLogger) putBuffer(b *bufferNode) { w.freeListMu.Unlock() } -func (w *mFileLogger) Exit() { - w.flush() +func (w *mFileLogger) Close() error { + return w.flush() } -func NewFileLogger(path, name string, flushInterval time.Duration, fileSplitSize uint64, bufferSize int) Writer { +func NewFileLogger(path, name string, flushInterval time.Duration, fileSplitSize uint64, bufferSize int) io.Writer { writer := &mFileLogger{ filepath: path, name: name, @@ -89,15 +90,19 @@ func (w *mFileLogger) flushDaemon() { } } -func (w *mFileLogger) flush() { - w.writer.Flush() - w.writer.Sync() +func (w *mFileLogger) flush() (err error) { + err = w.writer.Flush() + if err != nil { + return + } + err = w.writer.Sync() + return } -func (w *mFileLogger) Write(level Level, msg string) { +func (w *mFileLogger) Write(msg []byte) (n int, err error) { buf := w.getBuffer() - buf.WriteString(msg) + buf.Write(msg) w.mu.Lock() defer w.mu.Unlock() @@ -113,14 +118,13 @@ func (w *mFileLogger) Write(level Level, msg string) { writer = w.writer } - if err := writer.checkRotate(time.Now()); err != nil { + if err = writer.checkRotate(time.Now()); err != nil { fmt.Println("[logkit] check rotate err: " + err.Error()) return } - writer.Write(buf.Bytes()) w.putBuffer(buf) - + return writer.Write(buf.Bytes()) } func (bufferW *bufferWriter) Write(p []byte) (int, error) { diff --git a/gokit.go b/gokit.go index 3c66257..017b665 100644 --- a/gokit.go +++ b/gokit.go @@ -10,7 +10,7 @@ import ( var ( inited bool - logWriter Writer + logWriter io.Writer logLevel = LevelInfo logLevelName string logName string @@ -60,32 +60,42 @@ const ( type Writer interface { //Write 写日志 - Write(Level, string) + Write(msg []byte) (int, error) //Exit 日志退出 - Exit() + Close() error } func Exit() { - logWriter.Exit() - + logWriter.(io.Closer).Close() } -func Init(_channel Channel, name string, level Level, _alsoStdout bool, _withCaller Caller) error { +func Init(_channel Channel, name string, level Level, _alsoStdout bool, _withCaller Caller) (writer io.Writer, err error ){ if inited { - return fmt.Errorf("logkit has been inited") + return nil, fmt.Errorf("logkit has been inited") } if name != "" { logName = name } else { - return fmt.Errorf("log name must not be empty") + return nil, fmt.Errorf("log name must not be empty") } + if logWriter == nil && channel == FIlE { + if logPath == "" { + logPath = "/data/logs/" + logName + ".log" + } + logWriter = NewFileLogger(logPath, logName, time.Second*5, 1204*1024*1800, 4*1024) + } + if logWriter == nil && channel == SYSLOG { + logWriter, _ = NewSyslogWriter("", "", level, logName) + } + inited = true + logLevel = level channel = _channel alsoStdout = _alsoStdout withCaller = _withCaller - return nil + return logWriter, nil } func SetPath(path string) { @@ -116,24 +126,16 @@ func format(level Level, msg string) string { } } -func write(level Level, msg string) { +func write(level Level, msg string) (err error) { if !inited { - if logWriter == nil && channel == FIlE { - if logPath == "" { - logPath = "/data/logs/" + logName + ".log" - } - logWriter = NewFileLogger(logPath, logName, time.Second*5, 1204*1024*1800, 256*1024) - } - if logWriter == nil && channel == SYSLOG { - logWriter, _ = NewSyslogWriter("", "", level, logName) - } - inited = true + return fmt.Errorf("logkit has been inited") } messageStr := format(level, msg) - logWriter.Write(level, messageStr) + _, err = logWriter.Write([]byte(messageStr)) if alsoStdout { fmt.Print(messageStr) } + return } func level() Level { diff --git a/gokit_test.go b/gokit_test.go index 81a7506..316ee5a 100644 --- a/gokit_test.go +++ b/gokit_test.go @@ -16,7 +16,7 @@ func init() { func BenchmarkGoKit(b *testing.B) { defer Exit() - Init(SYSLOG, "test", LevelDebug, true, BasePath) + Init(FIlE, "test", LevelDebug, true, BasePath) b.ResetTimer() for i := 0; i < b.N; i++ { Info("test " + strconv.FormatInt(int64(i), 10)) diff --git a/syslog.go b/syslog.go index 7118181..8876aef 100644 --- a/syslog.go +++ b/syslog.go @@ -1,6 +1,8 @@ package logkit -import "log/syslog" +import ( + "log/syslog" +) type SyslogWriter struct { network string @@ -45,25 +47,11 @@ func NewSyslogWriter(network, raddr string, level Level, tag string) (Writer, er return object, nil } -func (self *SyslogWriter) Write(level Level, msg string) { - - switch level { - case LevelFatal: - self.writer.Crit(msg) - case LevelError: - self.writer.Err(msg) - case LevelWarn: - self.writer.Warning(msg) - case LevelInfo: - self.writer.Info(msg) - case LevelDebug: - self.writer.Debug(msg) - default: - self.writer.Write([]byte(msg)) - } +func (self *SyslogWriter) Write(msg []byte) (int, error) { + return self.writer.Write([]byte(msg)) } -func (self *SyslogWriter) Exit() { +func (self *SyslogWriter) Close() error{ // ignore the error return code - self.writer.Close() + return self.writer.Close() }