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  }