aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2019-12-30 18:20:11 +0100
committerMartin Polden <mpolden@mpolden.no>2019-12-30 18:21:48 +0100
commit187eee52f14cc0d0377d26bc81d88e482a5e4b13 (patch)
tree98d389033ab74e0ffb1c89e13b1e2124d2795834
parent096996d806f4c3e7ad21b4a5960f55663dfbfba9 (diff)
Simplify log pruning
-rw-r--r--log/logger.go40
-rw-r--r--log/logger_test.go10
2 files changed, 14 insertions, 36 deletions
diff --git a/log/logger.go b/log/logger.go
index 1a5b2d0..d8dc4af 100644
--- a/log/logger.go
+++ b/log/logger.go
@@ -26,7 +26,6 @@ type Logger struct {
queue chan Entry
db *sql.Client
wg sync.WaitGroup
- done chan bool
now func() time.Time
}
@@ -50,10 +49,6 @@ type Entry struct {
// New creates a new logger, writing log output to writer w prefixed with prefix. Persisted logging behaviour is
// controller by options.
func New(w io.Writer, prefix string, options RecordOptions) (*Logger, error) {
- return newLogger(w, prefix, options, time.Minute)
-}
-
-func newLogger(w io.Writer, prefix string, options RecordOptions, interval time.Duration) (*Logger, error) {
logger := &Logger{
Logger: log.New(w, prefix, 0),
queue: make(chan Entry, 100),
@@ -68,38 +63,13 @@ func newLogger(w io.Writer, prefix string, options RecordOptions, interval time.
}
}
logger.wg.Add(1)
- go logger.readQueue()
- if options.TTL > 0 {
- logger.wg.Add(1)
- logger.done = make(chan bool)
- go maintain(logger, options.TTL, interval)
- }
+ go logger.readQueue(options.TTL)
return logger, nil
}
-func maintain(logger *Logger, ttl, interval time.Duration) {
- defer logger.wg.Done()
- ticker := time.NewTicker(interval)
- for {
- select {
- case <-logger.done:
- ticker.Stop()
- return
- case <-ticker.C:
- t := logger.now().Add(-ttl)
- if err := logger.db.DeleteLogBefore(t); err != nil {
- logger.Printf("error deleting log entries before %v: %s", t, err)
- }
- }
- }
-}
-
// Close consumes any outstanding log requests and closes the logger.
func (l *Logger) Close() error {
close(l.queue)
- if l.done != nil {
- l.done <- true
- }
l.wg.Wait()
return nil
}
@@ -154,11 +124,17 @@ func (l *Logger) Get(n int) ([]Entry, error) {
return entries, nil
}
-func (l *Logger) readQueue() {
+func (l *Logger) readQueue(ttl time.Duration) {
defer l.wg.Done()
for e := range l.queue {
if err := l.db.WriteLog(e.Time, e.RemoteAddr, e.Hijacked, e.Qtype, e.Question, e.Answers...); err != nil {
l.Printf("write failed: %+v: %s", e, err)
}
+ if ttl > 0 {
+ t := l.now().Add(-ttl)
+ if err := l.db.DeleteLogBefore(t); err != nil {
+ l.Printf("deleting log entries before %v failed: %s", t, err)
+ }
+ }
}
}
diff --git a/log/logger_test.go b/log/logger_test.go
index 9a58292..f3a91f1 100644
--- a/log/logger_test.go
+++ b/log/logger_test.go
@@ -104,11 +104,11 @@ func TestAnswerMerging(t *testing.T) {
}
func TestLogPruning(t *testing.T) {
- logger, err := newLogger(os.Stderr, "test: ", RecordOptions{
+ logger, err := New(os.Stderr, "test: ", RecordOptions{
Mode: ModeAll,
Database: ":memory:",
TTL: time.Hour,
- }, 10*time.Millisecond)
+ })
if err != nil {
t.Fatal(err)
}
@@ -133,8 +133,10 @@ func TestLogPruning(t *testing.T) {
// Advance time beyond log TTL
tt = tt.Add(time.Hour).Add(time.Second)
- for len(entries) > 0 {
- entries, err = logger.Get(1)
+ // Trigger pruning by recording another entry
+ logger.Record(net.IPv4(192, 0, 2, 100), false, 1, "2.example.com.", "192.0.2.2")
+ for len(entries) > 1 {
+ entries, err = logger.Get(2)
if err != nil {
t.Fatal(err)
}