Go语言实现海量日志收集系统( 三 )

同样的这里增加对了限速的处理,毕竟日志收集程序不能影响了当前业务的性能,所以增加了limit.go用于限制速度:
package mainimport ("time""sync/atomic""github.com/astaxie/beego/logs")type SecondLimit struct {unixSecond int64curCount int32limit int32}func NewSecondLimit(limit int32) *SecondLimit {secLimit := &SecondLimit{unixSecond:time.Now().Unix(),curCount:0,limit:limit,}return secLimit}func (s *SecondLimit) Add(count int) {sec := time.Now().Unix()if sec == s.unixSecond {atomic.AddInt32(&s.curCount,int32(count))return}atomic.StoreInt64(&s.unixSecond,sec)atomic.StoreInt32(&s.curCount, int32(count))}func (s *SecondLimit) Wait()bool {for {sec := time.Now().Unix()if (sec == atomic.LoadInt64(&s.unixSecond)) && s.curCount == s.limit {time.Sleep(time.Microsecond)logs.Debug("limit is running,limit:%d s.curCount:%d",s.limit,s.curCount)continue}if sec != atomic.LoadInt64(&s.unixSecond) {atomic.StoreInt64(&s.unixSecond,sec)atomic.StoreInt32(&s.curCount,0)}logs.Debug("limit is exited")return false}}小结这次基本实现了日志收集的前半段的处理,后面将把日志扔到es中,并最终在页面上呈现
 
作者: 红烧不是清蒸
链接: http://www.cnblogs.com/zhaof/p/8910761.html

【Go语言实现海量日志收集系统】


推荐阅读