add ringlog
This commit is contained in:
parent
9c7492f38c
commit
4ee28e3818
|
|
@ -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
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue