2019-08-30 15:58:25 +01:00
. \" Generated by Mmark Markdown Processer - mmark.miek.nl
2026-03-27 05:35:09 +02:00
.TH "COREDNS-LOG" 7 "March 2026" "CoreDNS" "CoreDNS Plugins"
2019-04-06 08:42:40 +01:00
2019-06-24 12:37:27 +01:00
.SH "NAME"
2019-04-06 08:42:40 +01:00
.PP
\fI log\fP - enables query logging to standard output.
2019-06-24 12:37:27 +01:00
.SH "DESCRIPTION"
2019-04-06 08:42:40 +01:00
.PP
By just using \fI log\fP you dump all queries (and parts for the reply) on standard output. Options exist
2020-01-23 16:06:52 +01:00
to tweak the output a little. Note that for busy servers logging will incur a performance hit.
2019-04-06 08:42:40 +01:00
.PP
2020-01-23 16:06:52 +01:00
Enabling or disabling the \fI log\fP plugin only affects the query logging, any other logging from
CoreDNS will show up regardless.
2019-04-06 08:42:40 +01:00
2019-06-24 12:37:27 +01:00
.SH "SYNTAX"
2019-04-06 08:42:40 +01:00
.PP
.RS
2018-01-04 12:53:07 +00:00
2019-04-06 08:42:40 +01:00
.nf
2018-01-04 12:53:07 +00:00
log
2019-04-06 08:42:40 +01:00
2018-01-04 12:53:07 +00:00
.fi
2019-04-06 08:42:40 +01:00
.RE
.PP
2020-01-23 16:06:52 +01:00
With no arguments, a query log entry is written to \fI stdout\fP in the common log format for all requests.
2018-01-04 12:53:07 +00:00
Or if you want/need slightly more control:
2019-04-06 08:42:40 +01:00
.PP
.RS
2018-01-04 12:53:07 +00:00
.nf
2019-04-06 08:42:40 +01:00
log [NAMES...] [FORMAT]
2018-01-04 12:53:07 +00:00
.fi
2019-04-06 08:42:40 +01:00
.RE
.IP \(bu 4
\fB \fC NAMES\fR is the name list to match in order to be logged
.IP \(bu 4
\fB \fC FORMAT\fR is the log format to use (default is Common Log Format), \fB \fC {common}\fR is used as a shortcut
for the Common Log Format. You can also use \fB \fC {combined}\fR for a format that adds the query opcode
\fB \fC {>opcode}\fR to the Common Log Format.
.PP
2018-04-20 07:24:19 +01:00
You can further specify the classes of responses that get logged:
2018-01-04 12:53:07 +00:00
2019-04-06 08:42:40 +01:00
.PP
.RS
.nf
log [NAMES...] [FORMAT] {
class CLASSES...
2018-01-04 12:53:07 +00:00
}
2019-04-06 08:42:40 +01:00
2018-01-04 12:53:07 +00:00
.fi
2019-04-06 08:42:40 +01:00
.RE
.IP \(bu 4
\fB \fC CLASSES\fR is a space-separated list of classes of responses that should be logged
.PP
2018-04-20 07:24:19 +01:00
The classes of responses have the following meaning:
2019-04-06 08:42:40 +01:00
.IP \(bu 4
\fB \fC success\fR : successful response
.IP \(bu 4
\fB \fC denial\fR : either NXDOMAIN or nodata responses (Name exists, type does not). A nodata response
sets the return code to NOERROR.
.IP \(bu 4
\fB \fC error\fR : SERVFAIL, NOTIMP, REFUSED, etc. Anything that indicates the remote server is not willing to
resolve the request.
.IP \(bu 4
\fB \fC all\fR : the default - nothing is specified. Using of this class means that all messages will be
logged whatever we mix together with "all".
.PP
2020-01-23 16:06:52 +01:00
If no class is specified, it defaults to \fB \fC all\fR .
2019-04-06 08:42:40 +01:00
2019-06-24 12:37:27 +01:00
.SH "LOG FORMAT"
2019-04-06 08:42:40 +01:00
.PP
You can specify a custom log format with any placeholder values. Log supports both request and
response placeholders.
.PP
2018-01-04 12:53:07 +00:00
The following place holders are supported:
2019-04-06 08:42:40 +01:00
.IP \(bu 4
\fB \fC {type}\fR : qtype of the request
.IP \(bu 4
\fB \fC {name}\fR : qname of the request
.IP \(bu 4
\fB \fC {class}\fR : qclass of the request
.IP \(bu 4
\fB \fC {proto}\fR : protocol used (tcp or udp)
.IP \(bu 4
\fB \fC {remote}\fR : client's IP address, for IPv6 addresses these are enclosed in brackets: \fB \fC [::1]\fR
.IP \(bu 4
\fB \fC {local}\fR : server's IP address, for IPv6 addresses these are enclosed in brackets: \fB \fC [::1]\fR
.IP \(bu 4
\fB \fC {size}\fR : request size in bytes
.IP \(bu 4
\fB \fC {port}\fR : client's port
.IP \(bu 4
\fB \fC {duration}\fR : response duration
.IP \(bu 4
\fB \fC {rcode}\fR : response RCODE
.IP \(bu 4
\fB \fC {rsize}\fR : raw (uncompressed), response size (a client may receive a smaller response)
.IP \(bu 4
\fB \fC {>rflags}\fR : response flags, each set flag will be displayed, e.g. "aa, tc". This includes the qr
bit as well
.IP \(bu 4
\fB \fC {>bufsize}\fR : the EDNS0 buffer size advertised in the query
.IP \(bu 4
\fB \fC {>do}\fR : is the EDNS0 DO (DNSSEC OK) bit set in the query
.IP \(bu 4
\fB \fC {>id}\fR : query ID
.IP \(bu 4
\fB \fC {>opcode}\fR : query OPCODE
.IP \(bu 4
\fB \fC {common}\fR : the default Common Log Format.
.IP \(bu 4
\fB \fC {combined}\fR : the Common Log Format with the query opcode.
.IP \(bu 4
\fB \fC {/LABEL}\fR : any metadata label is accepted as a place holder if it is enclosed between \fB \fC {/\fR and
\fB \fC }\fR , the place holder will be replaced by the corresponding metadata value or the default value
\fB \fC -\fR if label is not defined. See the \fI metadata\fP plugin for more information.
.PP
2018-01-04 12:53:07 +00:00
The default Common Log Format is:
2019-04-06 08:42:40 +01:00
.PP
.RS
.nf
2018-12-11 20:46:02 +00:00
`{remote}:{port} \- {>id} "{type} {class} {name} {proto} {size} {>do} {>bufsize}" {rcode} {>rflags} {rsize} {duration}`
2019-04-06 08:42:40 +01:00
2018-12-11 20:46:02 +00:00
.fi
2019-04-06 08:42:40 +01:00
.RE
.PP
Each of these logs will be outputted with \fB \fC log.Infof\fR , so a typical example looks like this:
.PP
.RS
2018-12-11 20:46:02 +00:00
.nf
2019-09-27 13:30:22 +01:00
[INFO] [::1]:50759 \- 29008 "A IN example.org. udp 41 false 4096" NOERROR qr,rd,ra,ad 68 0.037990251s
2019-04-06 08:42:40 +01:00
2026-03-27 05:35:09 +02:00
.fi
.RE
.SH "ADDITIONAL METADATA"
.PP
The log plugin adds the following metadata to allow for granular differentiation of NOERROR denial vs success messages. These are mapped from \fB \fC plugin/pkg/response/classify.go\fR and \fB \fC plugin/pkg/response/typify.go\fR .
.IP \(bu 4
\fB \fC {/log/class}\fR : success, denial
.IP \(bu 4
\fB \fC {/log/type}\fR : NODATA, NXDOMAIN, NOERROR
.PP
.RS
2018-12-11 20:46:02 +00:00
2026-03-27 05:35:09 +02:00
.nf
\& . {
log . "{proto} Request: {name} {type} {/log/class} {/log/type}"
}
.fi
.RE
.SH "EXAMPLES"
.PP
2018-01-04 12:53:07 +00:00
Log all requests to stdout
2026-03-27 05:35:09 +02:00
.PP
.RS
.nf
2019-04-06 08:42:40 +01:00
\& . {
2018-01-04 12:53:07 +00:00
log
whoami
}
2019-04-06 08:42:40 +01:00
2018-01-04 12:53:07 +00:00
.fi
2019-04-06 08:42:40 +01:00
.RE
2018-01-04 12:53:07 +00:00
2019-04-06 08:42:40 +01:00
.PP
Custom log format, for all zones (\fB \fC .\fR )
.PP
.RS
.nf
\& . {
log . "{proto} Request: {name} {type} {>id}"
2018-01-04 12:53:07 +00:00
}
2019-04-06 08:42:40 +01:00
2018-01-04 12:53:07 +00:00
.fi
2019-04-06 08:42:40 +01:00
.RE
.PP
Only log denials (NXDOMAIN and nodata) for example.org (and below)
2018-01-04 12:53:07 +00:00
2019-04-06 08:42:40 +01:00
.PP
.RS
.nf
\& . {
log example.org {
2018-01-04 12:53:07 +00:00
class denial
}
}
2019-04-06 08:42:40 +01:00
2018-01-04 12:53:07 +00:00
.fi
2019-04-06 08:42:40 +01:00
.RE
.PP
Log all queries which were not resolved successfully in the Combined Log Format.
.PP
.RS
2018-04-20 07:24:19 +01:00
2019-04-06 08:42:40 +01:00
.nf
\& . {
log . {combined} {
2018-04-20 07:24:19 +01:00
class denial error
}
}
2019-04-06 08:42:40 +01:00
2018-04-20 07:24:19 +01:00
.fi
2019-04-06 08:42:40 +01:00
.RE
.PP
2018-04-20 07:24:19 +01:00
Log all queries on which we did not get errors
2019-04-06 08:42:40 +01:00
.PP
.RS
.nf
\& . {
log . {
2018-04-20 07:24:19 +01:00
class denial success
}
}
2019-04-06 08:42:40 +01:00
2018-04-20 07:24:19 +01:00
.fi
2019-04-06 08:42:40 +01:00
.RE
2018-04-20 07:24:19 +01:00
2019-04-06 08:42:40 +01:00
.PP
Also the multiple statements can be OR-ed, for example, we can rewrite the above case as following:
.PP
.RS
.nf
\& . {
log . {
2018-04-20 07:24:19 +01:00
class denial
class success
}
}
2019-04-06 08:42:40 +01:00
2018-04-20 07:24:19 +01:00
.fi
2019-04-06 08:42:40 +01:00
.RE
2018-01-04 12:53:07 +00:00