60 lines
		
	
	
		
			937 B
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			937 B
		
	
	
	
		
			Go
		
	
	
	
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
 | 
						|
}
 |