123456789101112131415161718192021222324252627282930313233343536373839404142 |
- package logx
- import (
- "sync/atomic"
- "time"
- "github.com/tal-tech/go-zero/core/syncx"
- "github.com/tal-tech/go-zero/core/timex"
- )
- type limitedExecutor struct {
- threshold time.Duration
- lastTime *syncx.AtomicDuration
- discarded uint32
- }
- func newLimitedExecutor(milliseconds int) *limitedExecutor {
- return &limitedExecutor{
- threshold: time.Duration(milliseconds) * time.Millisecond,
- lastTime: syncx.NewAtomicDuration(),
- }
- }
- func (le *limitedExecutor) logOrDiscard(execute func()) {
- if le == nil || le.threshold <= 0 {
- execute()
- return
- }
- now := timex.Now()
- 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()
- }
- }
|