github.com/sereiner/library@v0.0.0-20200518095232-1fa3e640cc5f/log/appender.stdout.go (about) 1 package log 2 3 import ( 4 "bytes" 5 "fmt" 6 "os" 7 "time" 8 9 "sync" 10 11 "github.com/wule61/log" 12 ) 13 14 //StdoutAppender 标准输出器 15 type StdoutAppender struct { 16 name string 17 lastWrite time.Time 18 layout *Appender 19 output *log.Logger 20 buffer *bytes.Buffer 21 ticker *time.Ticker 22 unq string 23 Level int 24 locker sync.Mutex 25 } 26 27 //NewStudoutAppender 构建基于文件流的日志输出对象 28 func NewStudoutAppender(unq string, layout *Appender) (fa *StdoutAppender, err error) { 29 fa = &StdoutAppender{layout: layout, unq: unq} 30 fa.Level = GetLevel(layout.Level) 31 fa.buffer = bytes.NewBufferString("") 32 fa.output = log.New(fa.buffer, "", log.Llongcolor) 33 intervalStr := layout.Interval 34 if intervalStr == "" { 35 intervalStr = "200ms" 36 } 37 interval, err := time.ParseDuration(intervalStr) 38 if err != nil { 39 err = fmt.Errorf("日志配置文件错误:%v", err) 40 return 41 } 42 fa.ticker = time.NewTicker(interval) 43 fa.output.SetOutputLevel(log.Ldebug) 44 go fa.writeTo() 45 return 46 } 47 48 //Write 写入日志 49 func (f *StdoutAppender) Write(event *LogEvent) { 50 current := GetLevel(event.Level) 51 if current < f.Level { 52 return 53 } 54 f.lastWrite = time.Now() 55 f.locker.Lock() 56 switch current { 57 case ILevel_Debug: 58 f.output.Debug(event.Output) 59 case ILevel_Info: 60 f.output.Info(event.Output) 61 case ILevel_Warn: 62 f.output.Warn(event.Output) 63 case ILevel_Error: 64 f.output.Error(event.Output) 65 case ILevel_Fatal: 66 f.output.Fatal(event.Output) 67 } 68 f.locker.Unlock() 69 } 70 71 //writeTo 定时写入文件 72 func (f *StdoutAppender) writeTo() { 73 START: 74 for { 75 select { 76 case _, ok := <-f.ticker.C: 77 if ok { 78 f.locker.Lock() 79 f.buffer.WriteTo(os.Stdout) 80 f.buffer.Reset() 81 f.locker.Unlock() 82 } else { 83 break START 84 } 85 } 86 } 87 } 88 89 //Close 关闭当前appender 90 func (f *StdoutAppender) Close() { 91 f.Level = ILevel_OFF 92 f.ticker.Stop() 93 f.locker.Lock() 94 f.buffer.WriteTo(os.Stdout) 95 f.locker.Unlock() 96 }