前幾天一直有網友詢問關於DNS的日志問題。今天我剛好有空,整理了一下分享給大家 icon_biggrin.gif
在默認情況下,BIND把日志消息寫到/var/log/messages文件中,而這些日志消息是非常少的,主要就是啟動,關閉的日志記錄和一些嚴重錯誤的消息,所以要詳細記錄服務器的運行狀況,需要自己配置服務器的日志行為。也就是要在配置文件named.conf中使用logging語句來定制自己所需要的日志記錄,logging語句的語法為:
代碼:
logging {
channel <string> {
file <logfile>;
syslog <optional_facility>;
null;
stderr;
severity <logseverity>;
print-time <boolean>;
print-severity <boolean>;
print-category <boolean>;
};
category <string> { <string>; ... };
};
在日志中主要有兩個概念:通道(channel)和類別(category)。通道指定了應該向哪裡發送日志數據:是發送給syslog,還是寫在一個文件裡,或是發送給named的標准錯誤輸出,還是發送到位存儲桶(bit bUCket)。類別則規定了哪些數據需要記錄。下面我們主要介紹一下文件通道和類別。
在定義通道的語句中,severity是指定記錄消息的級別。在bind中主要有以下幾個級別(按照嚴重性遞減的順序):
critical
error
warning
notice
info
debug [ level ]
dynamic
定義了某個級別後,系統會記錄包括該級別以及比該級別更嚴重的級別的所有消息。比如定義級別為error,則會記錄critical和error 兩個級別的信息。一般情況下,我們記錄到info級別就可以了。print-time是設定在日志中是否需要寫入時間,print-severity是設定在日志中是否需要寫入消息級別,print-category是設定在日志中是否需要寫入日志類別。
category語句是指定哪一種類別的數據使用哪個或者哪幾個已經定義了的通道。在bind9中類別有:
default
default類別匹配所有未明確指定通道的類別,但是不匹配不屬於任何類別的消息。這些不屬於任何類別的消息屬於下面列出的這些類別。
general
包括所有未明確分類的BIND消息。
client
處理客戶端請求。
config
配置文件分析和處理。
database
同BIND內部數據庫相關的消息,用來存儲區數據和緩存記錄。
dnssec
處理DNSSEC簽名的響應。
lame-servers
發現錯誤授權。
network
網絡操作
notify
異步區變動通知。
queries
查詢日志
resolver
名字解析,包括對來自解析器的遞歸查詢的處理。
security
認可/非認可的請求。
update
動態更新事件。
xfer-in
從遠程名字服務器到本地名字服務器的區傳送。
xfer-out
從本地名字服務器到遠程名字服務器的區傳送。
例如要記錄queries消息,就可以如下配置(把以下語句添加到named.conf中就可以了):
代碼:
logging {
channel query_log {
file "query.log" versions 3 size 20m;
severity info;
print-time yes;
print-category yes;
};
category queries {
query_log;
};
};
這樣服務器會在工作目錄(Directory語句所指定的目錄,通常為:/var/named)下創建query.log這個文件,並把運行過程產生的queries消息寫如到query.log文件中,如下:
Nov 28 16:04:55.516 queries: client 192.168.0.113#32770: query: dns.andy.com IN A
另外解釋一下“file "query.log" versions 3 size 20m;”語句中“version”和“size”的意義:
version是指定允許同時存在多少個版本的該文件,比如指定3個版本(version 3),bind9會保存query.log、query.log0、query.log1和query.log2。
Size是指定文件大小的上限,如果只設定了size而沒有設定version的話,當文件達到指定的文件大小上限時,服務器停止寫入該文件。如果設定了version的話,服務器會進行循環,比如把query.log變成query.log1,query.log1變成query.log2等,然後建立一個新的query.log進行寫入。