env_loggerによるロギング基礎

Rustのロギングには、 logenv_loggerの組み合わせが便利です。

ほかの言語と同様、error, warn, info, debug, traceといったログレベル別のログ出力、表示制御が可能です(デフォルトはerror)。

ログ出力

ログ出力は、logクレートのマクロを用います。
以下のように、ログレベルを指定するマクロでメッセージ出力します。使い方は、println!()と同様です。

use log::debug;

fn some_function() {
  debug!("some debug log");
}

ログ表示

ログ表示は、env_logger::init()を実行すると有効になります。

fn main() {
  env_logger::init();
}

ログレベルは、実行時に環境変数RUST_LOGで指定できます。

env_loggerがない場合の挙動

env_loggerなどのロギング実装がない場合の挙動は、 logのドキュメントに記載されています。

logクレートはロギング実装を切り替えられ、何も指定していない場合には、noopというほぼ何もしない実装で動作するようです。

Rustではクレートを細分化して実装する手法が一般的ですが、部品となるクレートはenv_loggerなどの存在を気にせずlogクレートのマクロでメッセージ実装しても問題ありません。

また、env_logger以外に利用できる実装は、logのドキュメントに掲載されています。
WebAssemblyなど、用途に応じて選択できます。

適切なログレベル

env_loggerのログレベルは利用しているクレートすべてに有効です。
たとえばdebugレベルでは、ネットワークミドルウェアなども詳細なログを出力するものがあります。

多くのログに埋没すると使いにくいため、目的に応じて適切なログレベルを選択することが重要です。

中馬崇尋
Chuma Takahiro