package logger import ( "sync" "time" "github.com/ReneKroon/ttlcache/v2" ) func NewLogLimiter(duration time.Duration, limit int) *LogLimiter { return &LogLimiter{ duration: duration, limit: limit, } } type LogLimiter struct { duration time.Duration limit int cache *ttlcache.Cache onceCache sync.Once } func (l *LogLimiter) Check(message string) bool { _, err := l.logCache().Get(message) if err == ttlcache.ErrNotFound { l.logCache().Set(message, true) return true } return false } func (l *LogLimiter) logCache() *ttlcache.Cache { l.onceCache.Do(func() { if l.cache == nil { cache := ttlcache.NewCache() cache.SetTTL(l.duration) cache.SetCacheSizeLimit(l.limit) l.cache = cache } }) return l.cache }