impl io.write

master
guohao 5 years ago
parent 0c99c1b6ee
commit e1e49548d3
  1. 26
      filelog.go
  2. 44
      gokit.go
  3. 2
      gokit_test.go
  4. 26
      syslog.go

@ -4,6 +4,7 @@ import (
"bufio" "bufio"
"bytes" "bytes"
"fmt" "fmt"
"io"
"os" "os"
"path/filepath" "path/filepath"
"sync" "sync"
@ -67,11 +68,11 @@ func (w *mFileLogger) putBuffer(b *bufferNode) {
w.freeListMu.Unlock() w.freeListMu.Unlock()
} }
func (w *mFileLogger) Exit() { func (w *mFileLogger) Close() error {
w.flush() 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{ writer := &mFileLogger{
filepath: path, filepath: path,
name: name, name: name,
@ -89,15 +90,19 @@ func (w *mFileLogger) flushDaemon() {
} }
} }
func (w *mFileLogger) flush() { func (w *mFileLogger) flush() (err error) {
w.writer.Flush() err = w.writer.Flush()
w.writer.Sync() 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 := w.getBuffer()
buf.WriteString(msg) buf.Write(msg)
w.mu.Lock() w.mu.Lock()
defer w.mu.Unlock() defer w.mu.Unlock()
@ -113,14 +118,13 @@ func (w *mFileLogger) Write(level Level, msg string) {
writer = w.writer 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()) fmt.Println("[logkit] check rotate err: " + err.Error())
return return
} }
writer.Write(buf.Bytes())
w.putBuffer(buf) w.putBuffer(buf)
return writer.Write(buf.Bytes())
} }
func (bufferW *bufferWriter) Write(p []byte) (int, error) { func (bufferW *bufferWriter) Write(p []byte) (int, error) {

@ -10,7 +10,7 @@ import (
var ( var (
inited bool inited bool
logWriter Writer logWriter io.Writer
logLevel = LevelInfo logLevel = LevelInfo
logLevelName string logLevelName string
logName string logName string
@ -60,32 +60,42 @@ const (
type Writer interface { type Writer interface {
//Write 写日志 //Write 写日志
Write(Level, string) Write(msg []byte) (int, error)
//Exit 日志退出 //Exit 日志退出
Exit() Close() error
} }
func Exit() { 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 { if inited {
return fmt.Errorf("logkit has been inited") return nil, fmt.Errorf("logkit has been inited")
} }
if name != "" { if name != "" {
logName = name logName = name
} else { } 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 logLevel = level
channel = _channel channel = _channel
alsoStdout = _alsoStdout alsoStdout = _alsoStdout
withCaller = _withCaller withCaller = _withCaller
return nil return logWriter, nil
} }
func SetPath(path string) { 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 !inited {
if logWriter == nil && channel == FIlE { return fmt.Errorf("logkit has been inited")
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
} }
messageStr := format(level, msg) messageStr := format(level, msg)
logWriter.Write(level, messageStr) _, err = logWriter.Write([]byte(messageStr))
if alsoStdout { if alsoStdout {
fmt.Print(messageStr) fmt.Print(messageStr)
} }
return
} }
func level() Level { func level() Level {

@ -16,7 +16,7 @@ func init() {
func BenchmarkGoKit(b *testing.B) { func BenchmarkGoKit(b *testing.B) {
defer Exit() defer Exit()
Init(SYSLOG, "test", LevelDebug, true, BasePath) Init(FIlE, "test", LevelDebug, true, BasePath)
b.ResetTimer() b.ResetTimer()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
Info("test " + strconv.FormatInt(int64(i), 10)) Info("test " + strconv.FormatInt(int64(i), 10))

@ -1,6 +1,8 @@
package logkit package logkit
import "log/syslog" import (
"log/syslog"
)
type SyslogWriter struct { type SyslogWriter struct {
network string network string
@ -45,25 +47,11 @@ func NewSyslogWriter(network, raddr string, level Level, tag string) (Writer, er
return object, nil return object, nil
} }
func (self *SyslogWriter) Write(level Level, msg string) { func (self *SyslogWriter) Write(msg []byte) (int, error) {
return self.writer.Write([]byte(msg))
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) Exit() { func (self *SyslogWriter) Close() error{
// ignore the error return code // ignore the error return code
self.writer.Close() return self.writer.Close()
} }

Loading…
Cancel
Save