package dns import ( "log/slog" "os" "time" ) type LogConfig struct { Logger *slog.Logger Level slog.Level } func NewDefaultLogConfig() *LogConfig { return &LogConfig{ Logger: slog.New(slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{ Level: slog.LevelInfo, })), Level: slog.LevelInfo, } } func LoggingMiddleware(config *LogConfig) func(Handler) Handler { if config == nil { config = NewDefaultLogConfig() } return func(next Handler) Handler { return HandlerFunc(func(w ResponseWriter, r *Request) { start := time.Now() next.ServeDNS(w, r) duration := time.Since(start) question := r.Message.Question[0] config.Logger.Info("query", "class", question.QClass.String(), "type", question.QType.String(), "name", question.QName, "rcode", r.Message.Header.RCode.String(), "remote_addr", r.RemoteAddr, "time_taken", duration.Nanoseconds(), ) }) } }