diff --git a/pkg/util/ringlog/ringlog.go b/pkg/util/ringlog/ringlog.go new file mode 100644 index 000000000..1c26ce3ba --- /dev/null +++ b/pkg/util/ringlog/ringlog.go @@ -0,0 +1,59 @@ +package ringlog + +import ( + "container/list" + "sync" +) + +// RingLogger describes ring logger methods +type RingLogger interface { + Insert(interface{}) + Walk() []interface{} +} + +// RingLog is a capped logger with fixed size +type RingLog struct { + sync.RWMutex + size int + list *list.List +} + +// New creates new Ring logger +func New(size int) *RingLog { + r := RingLog{ + list: list.New(), + size: size, + } + + return &r +} + +// Insert inserts new LogEntry into the ring logger +func (r *RingLog) Insert(obj interface{}) { + r.Lock() + defer r.Unlock() + + r.list.PushBack(obj) + if r.list.Len() > r.size { + r.list.Remove(r.list.Front()) + } +} + +// Walk dumps all the LogEntries from the Ring logger +func (r *RingLog) Walk() []interface{} { + res := make([]interface{}, 0) + + r.RLock() + defer r.RUnlock() + + st := r.list.Front() + for i := 0; i < r.size; i++ { + if st == nil { + return res + } + res = append(res, st.Value) + st = st.Next() + } + + return res +}