The server handles this case no need to also do it in the log plugin. Means DefaultErrorFunc can be private to the dnsserver and is now renamed to just errorFunc Fixes: #2715 Signed-off-by: Miek Gieben <miek@miek.nl>
71 lines
2 KiB
Go
71 lines
2 KiB
Go
// Package log implements basic but useful request (access) logging plugin.
|
|
package log
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/coredns/coredns/plugin"
|
|
"github.com/coredns/coredns/plugin/pkg/dnstest"
|
|
clog "github.com/coredns/coredns/plugin/pkg/log"
|
|
"github.com/coredns/coredns/plugin/pkg/replacer"
|
|
"github.com/coredns/coredns/plugin/pkg/response"
|
|
"github.com/coredns/coredns/request"
|
|
|
|
"github.com/miekg/dns"
|
|
)
|
|
|
|
// Logger is a basic request logging plugin.
|
|
type Logger struct {
|
|
Next plugin.Handler
|
|
Rules []Rule
|
|
|
|
repl replacer.Replacer
|
|
}
|
|
|
|
// ServeDNS implements the plugin.Handler interface.
|
|
func (l Logger) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
|
|
state := request.Request{W: w, Req: r}
|
|
for _, rule := range l.Rules {
|
|
if !plugin.Name(rule.NameScope).Matches(state.Name()) {
|
|
continue
|
|
}
|
|
|
|
rrw := dnstest.NewRecorder(w)
|
|
rc, err := plugin.NextOrFailure(l.Name(), l.Next, ctx, rrw, r)
|
|
|
|
tpe, _ := response.Typify(rrw.Msg, time.Now().UTC())
|
|
class := response.Classify(tpe)
|
|
// If we don't set up a class in config, the default "all" will be added
|
|
// and we shouldn't have an empty rule.Class.
|
|
_, ok := rule.Class[response.All]
|
|
_, ok1 := rule.Class[class]
|
|
if ok || ok1 {
|
|
logstr := l.repl.Replace(ctx, state, rrw, rule.Format)
|
|
clog.Infof(logstr)
|
|
}
|
|
|
|
return rc, err
|
|
|
|
}
|
|
return plugin.NextOrFailure(l.Name(), l.Next, ctx, w, r)
|
|
}
|
|
|
|
// Name implements the Handler interface.
|
|
func (l Logger) Name() string { return "log" }
|
|
|
|
// Rule configures the logging plugin.
|
|
type Rule struct {
|
|
NameScope string
|
|
Class map[response.Class]struct{}
|
|
Format string
|
|
}
|
|
|
|
const (
|
|
// CommonLogFormat is the common log format.
|
|
CommonLogFormat = `{remote}:{port} ` + replacer.EmptyValue + ` {>id} "{type} {class} {name} {proto} {size} {>do} {>bufsize}" {rcode} {>rflags} {rsize} {duration}`
|
|
// CombinedLogFormat is the combined log format.
|
|
CombinedLogFormat = CommonLogFormat + ` "{>opcode}"`
|
|
// DefaultLogFormat is the default log format.
|
|
DefaultLogFormat = CommonLogFormat
|
|
)
|