在默認情況下,BIND把日誌消息寫到/var/log/messages文件中,而這些日誌消息是非常少的,主要就是啓動,關閉的日誌記錄和一些嚴重錯誤的消息,所以要詳細記錄服務器的運行狀況,需要自己配置服務器的日誌行爲。也就是要在配置文件named.conf中使用logging語句來定製自己所需要的日誌記錄,logging語句的語法爲:
logging { channel ; { file ;; syslog ;; null; stderr; severity ;; print-time ;; print-severity ;; print-category ;; }; category ; { ;; ... }; };
在日誌中主要有兩個概念:通道(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 類別匹配所有未明確指定通道的類別,但是不匹配不屬於任何類別的消息。這些不屬於任何類別的消息屬於下面列出的這些類別。
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進行寫入。