1package dns
2
3import (
4 "log/slog"
5 "os"
6 "time"
7)
8
9type LogConfig struct {
10 Logger *slog.Logger
11 Level slog.Level
12}
13
14func NewDefaultLogConfig() *LogConfig {
15 return &LogConfig{
16 Logger: slog.New(slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{
17 Level: slog.LevelInfo,
18 })),
19 Level: slog.LevelInfo,
20 }
21}
22
23func LoggingMiddleware(config *LogConfig) func(Handler) Handler {
24 if config == nil {
25 config = NewDefaultLogConfig()
26 }
27
28 return func(next Handler) Handler {
29 return HandlerFunc(func(w ResponseWriter, r *Request) {
30 start := time.Now()
31
32 next.ServeDNS(w, r)
33
34 duration := time.Since(start)
35 question := r.Message.Question[0]
36 config.Logger.Info("query",
37 "class", question.QClass.String(),
38 "type", question.QType.String(),
39 "name", question.QName,
40 "rcode", r.Message.Header.RCode.String(),
41 "remote_addr", r.RemoteAddr,
42 "time_taken", duration.Nanoseconds(),
43 )
44 })
45 }
46}