package nlog import ( natomic "git.noahlan.cn/noahlan/ntool/nsys/atomic" "sync/atomic" "time" ) type limitedExecutor struct { threshold time.Duration lastTime *natomic.AtomicDuration discarded uint32 } func newLimitedExecutor(milliseconds int) *limitedExecutor { return &limitedExecutor{ threshold: time.Duration(milliseconds) * time.Millisecond, lastTime: natomic.NewAtomicDuration(), } } func (le *limitedExecutor) logOrDiscard(execute func()) { if le == nil || le.threshold <= 0 { execute() return } now := time.Since(time.Now().AddDate(-1, -1, -1)) if now-le.lastTime.Load() <= le.threshold { atomic.AddUint32(&le.discarded, 1) } else { le.lastTime.Set(now) discarded := atomic.SwapUint32(&le.discarded, 0) if discarded > 0 { Errorf("Discarded %d error messages", discarded) } execute() } }