logging ステートメントは、ネームサーバに対する様々な種類のログ用オプションを 設定します。 その中の channel フレーズでは、出力方法とフォーマットオプションと重大度を 名前と結びつけます。 この名前は後で category フレーズで使用し、様々なメッセージクラスをどのようにログに落すかを選択します。
ただ 1 つの logging ステートメントを使用して、望むだけ多くのチャネルとカテゴリを 定義できます。設定中に、複数の logging ステートメントがあった場合、 最初以外の logging ステートメントに対しては警告が出されます。 logging ステートメントが 1 個も存在しなかった場合、ログ用の設定は 次のようになるでしょう :
logging {
category default { default_syslog; default_debug; };
category panic { default_syslog; default_stderr; };
category packet { default_debug; };
category eventlib { default_debug; };
}; ログ用の設定は、 logging ステートメントがパースされたらすぐに確立されます。もし、設定ファイル 全体の処理状況についてのメッセージをリダイレクトしたいのであれば、 logging ステートメントが最初に出てくるようにしなければなりません。たとえ、 設定ファイルのパース状況を表すメッセージをリダイレクトしたくなくても、 logging ステートメントはファイルの先頭に置くことを勧めます。そうすることによって、 パーサの出すメッセージを再度設定する必要が生じたときに、意識して このルールを思い出す必要がなくなります。
ログの出力はすべて、1 つまたはそれ以上の「チャネル」へと渡ります。 チャネルは好きなだけ作ることができます。
それぞれのチャネルの定義には、そのチャネル用に選択したメッセージが ファイルに落されるのか、特別な syslog ファシリティに渡されるのか、 または、捨てられるのかを指定する節が含まれていなくてはなりません。 チャネルの定義では、チャネルが受け取るメッセージの重大度を制限する こともオプションでできます (デフォルトは info です)。また、 named が生成するタイムスタンプと、 カテゴリ名と、重大度を含めるかどうかを制限することもできます。 デフォルトでは、この 3 つのいずれも含めないようになっています。
チャネルに対するログの送り先のオプションに null という単語を使用すると、そのチャネルに送られるメッセージはすべて 捨てられるようになります。チャネルに対するその他のオプションは意味が ありません。
file 節を使用すると、ログファイルがどれだけ大きくなっても良いかということと、 ログファイルがオープンされるごとに 何個のバージョンを残すのかということに関する制限を、取り込むことができます。
ログファイルに対する size オプションは、単純にログが大きくなるのを制限する固い天井になるものです。 ログファイルが size を超えると、 ログファイルが再度オープンされるまで named はファイルに何も書き込みません。size を超えていても、自動的にはファイルは オープンされません。デフォルトでは、ログファイルのサイズ制限はありません。
ログファイルオプションに version を使用すると、 named は、ログファイルがオープンされるときにファイルのバックアップバージョンの 名前を変更して、指定した数だけ保持します。例えば、lamers.log というファイルの 古いバージョンを 3 つ保持するように選択した場合、lamer.log がオープンされる 直前に lamers.log.1 というファイルは lamers.log.2 という名前に変更され、 lamers.log.0 というファイルは lamers.log.1 という名前に変更され、そして lamers.log というファイルが lamers.log.0 という名前に変更されます。バージョン名 が巡回するものはデフォルトでは保持されません。 すでに存在しているログファイルは、 ただ単に追加して書かれます。 unlimited キーワードは、現在の BIND のリリースでは 99 と同義です。size および versions オプションの使用例は次の通りです :
channel an_example_level {
file "lamers.log" versions 3 size 20m;
print-time yes;
print-category yes;
}; syslog 節の引数は、 syslog(3) マニュアルページに記述されている syslog ファシリティを表します。 syslogd がこのファシリティに送られるメッセージをどのように扱うかについては、 syslog.conf(5) マニュアルページに記述があります。 openlog()() 関数に 2 つの引数しか使用しない、とても古いバージョンの syslog を 使用しているシステムをお使いの場合は、この節は黙って無視されます。
severity 節は、syslog の「優先度」のように働きます。ただし、syslog を 使用するかわりにファイルを直接書いても使用できるところが違います。 与えられた重大度よりも低いレベルのメッセージは、 このチャネルに対しては選択されません。与えられた重大度 よりも高いレベルのメッセージが受け取られます。
syslog を使っている場合、 syslog.conf での優先度によっても最終的に何が通り抜けるかが決定されます。 例えば、チャネルのファシリティおよび重大度を daemon および debug に定義しているが、 syslog.conf では daemon.warning しかログに落とさないようにしている場合、 info および notice の重大度を持ったメッセージは捨てられてしまいます。 状況が逆になり、 named が warning かそれ以上の重大度を持ったメッセージしか書きださないように なっている場合、 syslogd は、そのチャネルから受け取ったメッセージをすべて書き出すことでしょう。
デバッグモードになっている場合、サーバはもっと多くのデバッグ情報を 提供できます。サーバのデバッグレベルが 0 より大きくなっていれば、 デバッグモードは有効になっています。全体でのデバッグレベルは、 -d フラグに正の整数値を続けて指定して named サーバを開始するか、または、動いているサーバに SIGUSR1 シグナルを送る (例えば、 ndc trace を使って) ことによって設定します。 全体でのデバッグレベルは 0 にも設定でき、このときは、デバッグモードは 無効になります。この状態には、サーバに SIGUSR2 シグナルを送る ( ndc notrace を使って) ことによってもできます。 サーバでのデバッグメッセージにはすべてデバッグレベルがあります。 そして、デバッグレベルが高いほどより詳細な出力になっています。 例えば、特定のデバッグ重大度を次のように指定したチャネル では、サーバがデバッグモードであればいつでも、レベル 3 または それ以下のレベルのデバッグ出力が得られます。
channel specific_debug_level {
file "foo";
severity debug 3;
}; それは、全体でのデバッグレベルには依りません。 dynamic 重大度を指定したチャネルでは、どのメッセージを出力するかを 決めるためにサーバ全体のデバッグレベルを使用します。
print-time がオンになっていれば、日付および時刻がログに落とされます。 print-time は、syslog チャネルに対しても指定できますが、通常は意味のないことです。 なぜなら、syslog も日付および時刻は出力するからです。 print-category が要求されている場合、メッセージのカテゴリも同様にログに落とされます。 最後に、 print-severity がオンになっていれば、メッセージの重大度がログに落とされます。 print- オプションはどういう組合せでも使うことができ、 常に次のような順番で出力されます : それは time, category, severity の順です。 次に示す例は、3 つすべての print- オプションをオンにした例です :
28-Apr-1997 15:05:32.863 default: notice: Ready to answer queries.
named でのデフォルトのログ取得用に使用されるチャネルには、次のような、 事前に定義された 4 つがあります。どのようにこのチャネルを使うのかに ついては次節 category フレーズ に記述があります。
channel default_syslog {
syslog daemon; # syslog の daemon ファシリティに送る
severity info; # 優先度が info およびそれ以上のものだけ送る
};
channel default_debug {
file "named.run"; # 作業ディレクトリ内の named.run ファイルに
# 書き込む
# 注 : サーバが -f オプションつきで開始されている
# 場合は、"named.run" の代わりに標準エラー
# 出力が使われます。
severity dynamic; # サーバの現在のデバッグレベルをログに落とす
};
channel default_stderr { # 標準エラー出力に書き出す
file "<stderr>"; # ここでは、見えるように書いただけです。現在、
# 内部のファイルディスクリプタを設定ファイルの
# 文中に記述する方法はありません。
severity info; # 優先度が info およびそれ以上のものだけ送る
};
channel null {
null; # このチャネルに送られたメッセージはみなはじく
}; いったんチャネルが定義されると、再設定はできません。そのため、組み込みの チャネルは直接変更できないわけです。しかし、定義したチャネルでのカテゴリを 指し示すことによって、デフォルトのログ用機能を変更することができます。