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