本节书摘来自异步社区《DNS与BIND(第5版)》一书中的第7章,第7.5节,作者: 【美】Joseph Davies 更多章节内容可以访问云栖社区“异步社区”公众号查看。
7.5 日志记录
BIND支持扩展的日志记录(logging),包括将信息写入调试文件和发送至syslog。不过,使用扩展的日志记录是有代价的;在能够有效地控制该子系统前,必须要学习很多知识。如果没有时间来实验日志记录,那么就先使用默认值,等以后有空再来研究这个主题。大部分人并不需要更改日志记录的默认行为。
日志记录有两个主要的概念:通道(channels)和类别(categories)。通道用来指定日志数据的流向:syslog、文件、named的标准错误输出或是bit bucket。类别用来指定记录哪些数据。在BIND的源码中,名称服务器所记录的大部分消息,会根据其所涉及代码的相关功能加以分类。例如,BIND中处理动态更新的代码所产生的消息,很可能属于update类别。稍后本书将提供这些类别的列表。
每个类别的数据可以被发送到一个或多个通道。在图7-1中,查询类别的消息被记录到文件中,而区域传输数据则会在记录到文件的同时发送至syslog。
https://yqfile.alicdn.com/d44a5e23b107df5d77d6b41944b5f1d74df88994.png" >
通道允许根据消息的严重级别来进行过滤。下面是严重级别的列表,按照严重性递减的顺序排列:
https://yqfile.alicdn.com/f767c22c27683f4835a18f6b77c2d24e81262021.png" >
最前面5个严重级别(critical、error、warning、notice和info)就是syslog所使用的严重级别。而后两个(debug和dynamic)则是BIND所特有的。
可以通过debug来指定名称服务器的调试级别。如果忽略了调试级别,名称服务器会假定级别是1。如果指定了调试级别,那么在名称服务器调试功能打开时会看到该级别的消息(例如,如果指定“debug 3”,则只发送一条trace命令给名称服务器,就会看到级别3的调试消息)。如果将严重级别指定为dynamic,则名称服务器会记录匹配其调试级别的消息。(例如,给名称服务器发送一条trace命令,则会记录级别1的消息。而给名称服务器发送三条trace命令,则会记录从级别1到3的消息。)默认的严重级别是info,这意味着除非修改严重级别,否则不会看到调试消息。
提示
可以配置一个通道,将调试消息和syslog消息记录到一个文件中。但反之不然:不能配置一个通道,用syslog来记录调试消息和syslog消息;调试消息无法发送给syslog。
下面配置两个通道来说明其如何工作。第一个通道将发给syslog,并使用daemon设备进行记录,发送严重级别为info及以上的消息。第二个通道将发给一个文件,记录所有级别的调试消息以及syslog消息。下面是该logging语句的配置:
https://yqfile.alicdn.com/68b5f578bd0934d9ff93b62f12f896881801f6d8.png" >
现在已经配置了两个通道,还必须明确告诉名称服务器要向这两个通道发送哪些消息。根据图7-1所示,将区域传输类别的消息发给syslog和文件,而将查询类别的消息发给文件。由于对类别的设置也是logging语句的一部分,所以将其放在前面所示的logging语句中:
https://yqfile.alicdn.com/bed997c3d7bf52af7a01fa119b5663f30de34ff7.png" >
在配置文件中加入上述logging语句后,启动名称服务器并向它发送几个查询。如果没有任何消息写入log.msgs文件,则需要打开名称服务器的调试功能以记录查询消息:
现在,如果向名称服务器发送一些查询,则它们会被记录到log.msgs文件中。但是查找名称服务器的工作目录:将会找到一个名为named.run的新文件。所有其他调试信息都会写入该文件。不过如果仅打算记录传输与查询的日志,而不记录其他的调试信息,要怎么做才能不产生named.run文件呢?
日志记录中还有一个特殊的类别没有说明:default。如果没有为某个类别分配任何通道,则BIND会将此类消息发送至分配给defaul__t类别的通道。可以通过修改defaul__t类别的配置,来丢弃所有的日志消息(有一个null通道可以实现该 目的):
https://yqfile.alicdn.com/eeeedf214016664026e283b4cf1ccdd256898077.png" >
现在,启动服务器,将调试级别设置为1(如果有必要的话),并发送一些查询。这些查询将会记录在log.msgs文件最后,虽然仍会生成named.run文件但其内容为空。很好!已经开始逐渐掌握该功能了。
过了几天,会发现名称服务器发送至syslog的消息,比过去少得多。这是怎么回事呢?
在默认情况下,defaul__t类别被设置为:将消息同时发送至syslog和调试文件(named.run)。当把defaul__t类别设置为发送至null通道时,就同时关闭了其他syslog消息。所以应该将设置改为:
https://yqfile.alicdn.com/07898f6e7127bb49ad7c593f0bd605b356b6f4b9.png" >
这会将syslog消息发送至syslog,但不会将调试或syslog消息写入文件中。
记住,要想完全掌握日志记录,那么一定要花一些时间去实验它。对于可能遇到的问题,希望这些例子能够提供一些指引。现在,本节将更深入地讨论日志记录的相关细节。
**
7.5.1 logging语句**
下面是logging语句的语法,相当复杂。下面将举更多的例子来解释每条子语句的含义:
https://yqfile.alicdn.com/578266557f1f24a4b4ae13aca498cc11e5e227a5.png" >
以下是默认的通道。即使不使用它们,名称服务器也会创建这些通道。不能重新定义这些通道;只能增加新的通道。
如果没有为default、panic、packet及eventlib分配通道,则BIND 8名称服务器默认会为其分配以下通道:
https://yqfile.alicdn.com/600b77dc25ee47dca3fac2683828693f3faef3f1.png" >
而BIND 9名称服务器默认会使用以下logging语句:
https://yqfile.alicdn.com/35dd3e6bd3961ea70f6d78e75aa36ab55006509a.png" >
本书前面提到,default类别将消息同时记录到syslog和调试文件(默认为named.run)。这意味着所有严重级别为info及以上的syslog消息都会发送至syslog,并且当调试功能打开时,syslog消息及调试消息都会写入named.run文件中。
**
7.5.2 通道详解**
通道可以被定义为发送至文件、syslog或null。
1.文件通道
如果通道发送至一个文件,则必须指定文件的路径名称。另外,还可以指定该文件可以同时存在多少个版本,以及该文件大小的最大值。
如果指定文件可以存在三个版本,则BIND将保留file、file.0、file.1和file.2。在名称服务器启动或重载后,它会把file.1改为file.2,把file.0改为file.1,把file改为file.0,并创建一个新的file。如果指定了无限的版本数,则BIND将保留99个版本的文件。
如果指定了文件大小的最大值,则名称服务器会在文件达到指定的大小后,停止写入该文件。与versions子语句(上一段提到过)不同的是,当达到指定大小时,不是循环覆盖使用该文件,而是打开一个新的文件。如果不指定文件的大小,则文件可以无限增大。
下面是一个文件通道的例子,使用了versions和size子语句:
https://yqfile.alicdn.com/278622aece07e4ef15454b04ff184094dc86414e.png" >
正如例子所示,文件大小可以使用换算系数(scaling factor)。K或k表示kilobytes;M或m表示megabytes;G或g表示gigabytes。
有一点很重要,如果想看到调试消息,则需要将严重级别指定为debug或dynamic。默认的严重级别为info,仅显示syslog消息。
2.syslog通道
如果通道发送至syslog,则可以指定为下面任意一个设备:kern、user、mail、daemon、auth、syslog、lpr、news、uucp、cron、authpriv、ftp、local0、local1、local2、local3、local4、local5、local6或local7。默认值为daemon,本书建议使用该默认值,或者使用local设备。
下面是一个syslog通道的例子,使用了设备local0而不是daemon:
https://yqfile.alicdn.com/5ccfbb2287103dca4a092c9be99561a4a6ac67fc.png" >
3.stderr通道
default_stderr是一个预定义通道,用于任何打算写入名称服务器stderr文件描述符中的消息。在BIND 8中,不能配置其他文件描述符来使用stderr。但在BIND 9中可以。
4.null通道
null通道是一个预定义通道,用于任何打算丢弃的消息。
5.所有通道的数据格式
BIND日志设备还允许对消息的格式做一些控制。可以在消息中增加时间戳、类别以及严重级别。
下面是一个调试消息的例子,包含所有额外的数据格式:
这条消息的类别是config,并且严重级别为debug级别1。
下面是一个通道配置的例子,包含所有三个附加的数据格式:
在syslog通道中,其实不需要给消息增加时间戳,因为syslog自己会增加时间和日期。
7.5.3 类别详解
BIND 8及BIND 9都拥有很多类别。不幸的是,它们的类别并不相同。下面会将它们全部列出。与其试图弄清楚哪些是想要看到的,本书建议还是先对名称服务器进行配置,让其显示出所有的日志消息,包括它们的类别和严重级别,然后再挑选出想要看到的。待介绍完所有类别后,本书再介绍应该如何做。
1.BIND 8的类别
default
如果没有为类别指定任何通道,则其会使用default类别的通道。在这种意义上,default就代表着所有类别。由于有一些消息不属于任何类别,所以,即使给每个类别分别指定了通道,但为了所有未分类的消息,仍然需要给default类别指定一个通道。
如果没有为default类别指定通道,则系统会指定如下配置:
https://yqfile.alicdn.com/c8b0d6e51a9f938d464378de1f0619f449b1413b.png" >
cname
CNAME错误(例如,“. . . has CNAME and other data”)。
config
高级别的配置文件处理。
db
数据库操作。
eventlib
系统事件;必须指向一个文件通道。其默认为:
insist
内部一致性检查失败。
lame-servers
错误授权的检测。
load
区域载入消息。
maintenance
定期维护事件(例如,系统查询)。
ncache
否定缓存事件。
notify
异步区域变更通知。
os
操作系统的相关问题。
packet
所接收和发送包的解码;必须指向一个文件通道。其默认为:
https://yqfile.alicdn.com/ba8b275f600f84bbcfa5623f371311613c3c5304.png" >
panic
导致服务器关闭的问题。这些问题会被同时记录到panic类别和其原本所属的类别中。其默认为:
parser
低级别的配置文件处理。
queries
查询日志。
response-checks
有问题的应答、无关的附加信息等。
security
认可的/未认可的请求。
statistics
活动的定期报告。
update
动态更新事件。
update-security
未认可的动态更新。(在BIND 版中,这些消息被移至它们自己的类别,所以管理员更容易将它们过滤出来。)
xfer-in
从远程名称服务器到本地名称服务器的区域传输。
xfer-out
从本地名称服务器到远程名称服务器的区域传输。
2.BIND 9的类别
default
如同BIND 8,BIND 9的default类别匹配所有未明确分配通道的类别。与BIND 8不同的是,BIND 9的default类别不匹配未分类的BIND的消息。这些消息属于下面这个类别的一部分。
general
genera__l类别包括所有未明确分类的BIND消息。
client
处理客户端的请求。
config
配置文件的分析与处理。
database
BIND内部数据库的相关消息;用于储存区域数据及缓存记录。
dnssec
处理DNSSEC-signed的响应。
lame-servers
错误授权的检测(BIND 中重新加入该功能;在此之前,lame server消息被记录到resolver中)。
network
网络操作。
notify
异步区域变更通知。
queries
查询日志(BIND 中加入该功能)。
resolver
名称解析,包括来自解析器递归查询的处理。
security
认可的/未认可的请求。
update
动态更新事件。
update-security
未认可的动态更新。相关注意事项如同BIND 8(BIND 版中加入该功能)。
xfer-in
从远程名称服务器到本地名称服务器的区域传输。
xfer-out
从本地名称服务器到远程名称服务器的区域传输。
3.查看所有类别消息
充分了解日志记录的好方法是:先配置名称服务器将所有消息记录到一个文件中,包括它们的类别和严重级别,然后再挑选出感兴趣的消息。
前面曾经列出类别的默认配置。下面是BIND 8的:
而下面是BIND 9的:
https://yqfile.alicdn.com/ffe9f09c7cb367d8b5c2880657711e437e6963d1.png" >
默认情况下,写入default___debug通道的消息并不包含类别及严重级别。为了能够看到所有的日志消息,以及它们的类别和严重级别,必须自行配置每个类别。
下面是BIND 8的logging语句:
(BIND 9的logging语句中没有panic、packet或eventlib类别。)
注意,上述配置在定义每个类别时都包含了my___file通道。还增加了一个在默认logging语句中所没有的类别:queries。除非配置了queries类别,否则查询的日志消息不会被显示出来。
启动服务器并将调试打开到级别1。然后会在log.msgs文件中看到如下消息。(BIND 9仅显示查询消息,因为它已经不再产生这些调试消息了。)
https://yqfile.alicdn.com/640b99d99d8145665de58a20b430e5094655b29e.png" >
一旦确定了感兴趣的消息,就可以配置服务器仅记录这些消息了。