bind日志配置
bind中我们可以通过配置logging来记录日志信息,以便以后对服务器的分析及问题的跟踪。logging语句为域名服务器设定了一个多样性的logging选项。它的channel短语对应于输出方式、格式选项和分类级别,它的名称可以与category短语一起定义多样的日志信息。只用一个logging语句就可以用来定义多个channel和category。如果没有logging 语句的话,logging设置就是:
logging {
category "unmatched" { "null"; };
category "default" { "default_syslog"; "default_debug"; };
};
在BIND9中,logging的配置只有在整个配置文件被读取后才被执行。而在BIND8中,logging部分被读取后就开始执行了。当服务器启动时,所有在配置文件中关于语法错误的logging信息都转到缺省通道(channel)中,或者使用”-g”选项,指定转成标准错误。
一、logging语法定义
logging {
[ channel channel_name {
( file path name
[ versions ( number | unlimited ) ]
[ size size spec ]
| syslog syslog_facility
| stderr
| null );
[ severity (critical | error | warning | notice |
info | debug [ level ] | dynamic ); ]
[ print-category yes or no; ]
[ print-severity yes or no; ]
[ print-time yes or no; ]
}; ]
[ category category_name {
channel_name ; [ channel_name ; ... ]
}; ]
...
};
1.channel
所有日志会输出到一个或多个channel中;你可以定义所有你想要的通道。每个通道的定义必须包括一个目的字句,用来确定所选的相关通道的信息,将会被输出到一个文件,或者到一个特殊的syslog工具,或者到一个标准错误流,或者被忽略。它也可以随意的限制通道能接受的信息级别(默认值info),定义是否包含一个由named产生的时间标记,或者是否包含分类的名称、级别等(默认是不包含任何内容)。
①目的子句为null时,会使所有发送给通道的信息被丢弃;那样的话,其他通道选项就没有意义了。
②目的子句为file 时,会使通道的内容输出到一个磁盘文件。它可以包含这个文件的大小和该文件可以保存多少个版本。
③如果使用versions日志文件选项,named就会自动保留多个版本的日志文件。例如,如果选择保存文件lamers.log的三个老版本,那么在它被打开的时候lamers.log.1被更名为lamers.log.2,lamers.log.0 被更名为lamers.log.1 ,lamers.log 被更名为lamers.log.0。也可以设置version unlimited,这样就没有备份版本的限制了。
④如果对日志文件设置了size选项,那么仅当此文件超过了设定的大小时,系统就会进行更名。默认情况下不储存备份文件;所有存在的日志文件被简单进行追加。文件的size 选项用来限制日志的增长。如果文件超过了限制,又没有versions选项,则named 就会停止写入文件。如果保留了备份版本,则备份文件如上所述进行滚动命名,然后开始创建一个新的文件。如果没有versions选项,也没有其它的机制来删除或减小日志文件,则系统就不会有数据继续写入日志中。默认状态是不限制文件的大小的。
size 和versions 选项的使用例子:
channel "an_example_channel" {
file "example.log" versions 3 size 20m;
print-time yes;
print-category yes;
};
⑤syslog 目的子句是把通道指向系统日志。它的参数是一个syslog的前缀,如syslog帮助中所述。syslog是怎样处理带有这些前缀的信息,可以参考syslog.conf 的帮助信息。
⑥severity子句象syslog中的”priorites”一样工作,唯一区别的是用户可以直接写入一个文件,而不是使用syslog写入一个文件。不到严重级的信息将不会被通道选择;高严重级的信息将会被接受。
如果用户正在使用syslog,那么syslog.conf 的优先级也会决定什么会最终通过。例如,将channel facility和severity定义成daemon和debug,就不会只记录通过syslog.conf的daemon.warning信息,后者会使severity是info和notice的信息被丢弃。如果情况相反,named就会只记录warning或更高级别的信息,而syslogd则会记录来自于通道的所有信息。
⑦stderr目的子句将通道输出到服务器的标准错误流。它用于服务器在前台运行的情况下,例如,当处于debug模式的时候,服务器能提供丰富的调试信息。如果服务器的全局debug级别(globe debug level)大于0,debug 模式将被**。全局debug级别可以通过在启动named时设置“-d”参数加一个正数,或运行rndc trace来设置。如果要关闭debug模式,则将全局debug 级别设置成0,或运行rndc notrace。服务器中所有的debug信息有一个debug级别,高调试级给出更详细的输出。
例如,指定调试严重级别的通道:
channel "specific_debug_level" {
file "foo";
severity debug 3;
};
上例中,服务器在处于debug模式的时候都会收到3级和比3级小的级别的调试信息,全局的调试级别在这里不起作用。dynamic严重级别的通道将使用服务器全局debug级别决定打印哪些信息。
⑧如果使用了print-time参数,则日期和时间也将会记录下来。print-time也可以针对syslog的通道进行设置,但因为syslog也打印日期和时间,所以一般来讲,这没有什么意义。如果设置了print-category 参数,则信息的分类也会记录下来。如果设置了print-severity参数,则信息的严重级别也会记录下来。print-xxx 选项可以进行多重组合,单输出格式都是这个顺序:时间、分类、严重级别。
下面是一个当三个打印选项都设置的例子:
17-Apr-2015 15:05:32.863 general: notice: running
下面是named 提前定义的四个通道,用于指定缺省的日志。
channel "default_syslog" {
syslog daemon; // 发送给syslog 的daemon facility
severity info; //只发送此优先级和更高优先级的信息
};
channel "default_debug" {
file "named.run"; // 写入工作目录下的named.run 文件。注意:如果服务器用-f 参数启动,则"named.run"会被stderr 所替换。
severity dynamic; // 按照服务器当前的debug 级别记录日志
};
channel "default_stderr"{
stderr; //写到stderr
severity info; //只发送此优先级和更高优先级的信息
};
channel "null" {
null; // 丢弃所有发到此通道的信息
};
default_debug 通道有特殊的性质:只有当服务器的debug级别非0的时候,它才产生输出。一般来说,它会在服务器的工作目录中写入named.run文件。
因为安全原因,当在命令行选项中使用了“-u”参数后,只有当named使用了新的UID
后,named.run文件才会产生,以root身份启动和运行的named所产生的debug信息将会被丢弃。如果用户需要得到这些输出,则必须使用“-g”参数运行服务器,并重新将标准错误定向到一个文件中去。
一旦定义好一个通道,它就不能被重新定义。这样就不能修改内置的通道,但是可以通
过把分类指向你已经定义的通道,来修改默认的日志记录。
2.category
这里存在许多分类,用户可根据需要定义想看到或不想看到的日志。如果你不将某个分类指定到某些通道的话,那么在这个分类的日志信息就会被发送到default分类通道中。如果用户没有设定缺省的分类,下列"default"则会被系统使用:
category "default" { "default_syslog"; "default_debug"; };
作为一个例子,假定你要在文件中记录安全事件,但您也要保留缺省的日志文件。最好按照下面配置:
channel "my_security_channel" {
file "my_security_file";
severity info;
};
category "security" {
"my_security_channel";
"default_syslog";
"default_debug";
};
为了丢弃一个分类中的所有信息,可以设定null 通道:
category "xfer-out" { "null"; };
category "notify" { "null"; };
下面是可用的分类和相关的简明描述,以后的BIND版本中会包含更多的分类:
default: 默认分类,没有分类的日志都使用这个分类的配置.
general: 没有分类的日志都记录在此分类中.
database: 服务器内部使用存储zone和缓存数据.
security: 允许/拒绝的请求.
config: 配置文件分析和处理.
resolver: DNS解析,被dns缓存服务器进行递归查询.
xfer-in: 接收区域传输.
xfer-out: 发送区域传输.
notify: NOTIFY协议.
client: 客户端请求进程.
unmatched: 未匹配的查询.
network: 网络操作.
update: 动态更新.
update-security: 允许/拒绝更新请求.
queries: 客户端队列日志.
dispatch: 数据包传送日志.
dnssec: DNSSEC和TSIG协议处理.
lame-servers: 远端的配置错误的服务器发送的请求.
delegation-only: NXDOMAIN的结果将被强制定义到delegation-only区域.
二、配置实例
logging {
/*指定服务器日志记录的内容和日志信息来源*/
channel "default_syslog" {
syslog daemon; /* 发送给syslog 的daemon facility */
severity info; /* 只发送此优先级和更高优先级的信息 */
};
channel default_debug {
file "data/named.run"; /* 写入工作目录下的named.run 文件。注意:如果服务器用-f 参数启动,则"named.run"会被stderr 所替换。*/
severity dynamic; /* 按照服务器当前的debug 级别记录日志 */
};
channel xfer_in_log {
file "/var/log/named/xfer_in_log" versions 100 size 10m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
channel xfer_out_log {
file "/var/log/named/xfer_out_log" versions 100 size 10m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
channel notify_log {
file "/var/log/named/notify_log" versions 100 size 10m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
channel general_log {
file "/var/log/named/general_log" versions 400 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
channel default_log {
file "/var/log/named/default_log" versions 400 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
channel update_log {
file "/var/log/named/update_log" versions 100 size 10m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
channel query_log {
file "/var/log/query_log" versions 1024 size 1m;
severity info;
print-category no;
print-severity no;
print-time yes;
};
category queries { query_log; };
category default { default_log; };
category general { general_log; };
category xfer-in { xfer_in_log; };
category xfer-out { xfer_out_log; };
category notify { notify_log; };
category update { update_log; };
};
参考文章: