Kafka のログディレクトリ設定

(最終更新:2016 年 2 月 10 日)

Kafka のログディレクトリの設定は少し複雑だ。なぜなら、Kafka の動作やエラーを記録するファイルをログと呼ぶのに 加え 、Kafka が取り扱うデータ自体も「ログ」と呼ぶからだ(メッセージとかレコードなら混乱は少なかったのではないか)。

Kafka の設定ファイルなどには “log” と名前が付いた項目がいくつかある。本記事では 2 つのログの出力先を設定する方法を説明する。

Kafka の動作ログ

まずは、一般的に「ログ」というときに指すであろう、動作やエラーを記録するためのログ設定を紹介する。

Kafka では log4j をログ記録のために使っている。したがって動作ログの出力先を変えるには log4j の設定を変えればよい。チュートリアル通りなら Kafka を次のコマンドで起動しているはずだ:

bin/kafka-server-start.sh config/server.properties

このスクリプトの起動時に LOG_DIR 環境変数を設定しておくと、そこがログ出力先になる。変数を設定しない場合は bin ディレクトリと同じ階層に logs ディレクトリが作られる。

LOG_DIR 環境変数が最終的にどこに渡るのか、少し探求してみる。まず kafka-server-start.sh スクリプトの中身をたどると、最終行で kafka-run-class.sh というスクリプトを呼び出すことが分かる。

kafka-run-class.sh の中で LOG_DIR 変数の値を読み取っている。設定されていない場合のデフォルト値は $(dirname $0)/../logs である。 LOG_DIR が指すパスが存在しなければディレクトリを作成し、最終的に -Dkafka.logs.dir=$LOG_DIR という java のオプションになる。

データとしてのログ

次は、Kafka が扱うデータとしてのログ設定を紹介する。

データとしてのログ設定は config/server.properties の中で行う。関連する設定項目は 2 つある。log.dir と log.dirs だ。動作ログは kafka.logs.dir であり、名前がバナナチョコとチョコバナナくらい似ているので注意しよう。

log.dir はディレクトリを 1 つ指定でき、log.dirs はコンマ区切りで複数指定できる。log.dirs が設定されていない場合に log.dir の設定が有効となる。新たなパーティションが生成されるたびにここで設定したディレクトリにデータが格納される。複数指定した場合、最もパーティション数の少ないディレクトリが選択される。

server.properties では log.dirs に /tmp/kafka-logs が設定されており、これは log.dir も log.dirs も設定しなかった場合のデフォルト値でもある。ただ /tmp は再起動により削除されたり、アクセスがない状態で時間が経つと自動削除されたりするため、本番運用では 使用しないほうが良い のではないかと筆者は考えている。さらに /tmp が tmpfs の場合はログが まったく 永続化されないので、レプリカを持つすべてのブローカノードが落ちるとデータが失われる。