a recursive dns resolver
at main 921 B view raw
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}