RocketとRikerがある環境でロガーをどうしたらいいか?
どのクレートを選ぶか? どう設定するか?
ロガーの選択肢
env_logger
slog
env_logger::init()とかって何をやっているの? 具体的には出力レベルをどこに持っているの? 他のロガー実装と競合しないの?
log::set_loggerがstatic変数LOGGERにロガー実装をセットしてる。
マクロはこれを参照する関数に書き換えられる
つまりLOGGERの上書きが発生し得る
とすると、RocketとRikerの後で初期化した方のロガーが使われるのだろう
その非同期的性質から、Rikerの方がいつも後になりそう(未確認)
どうも、ソース読んだ感じだと初期化は非同期じゃなさそう。なので開発者側で順番をコントロールできそう
Rocket
独自実装:RocketLogger
write!()とprintln!()で出力
flush()の実装は空っぽ
環境がdebugかreleaseかでデフォルトログレベルが変わる
debugの場合Normal -> Info
releaseの場合Critical -> Warn
設定はROCKET_LOGとかRocket.tomlとか
と思いきやROCKET_LOGが効かない……デバッグビルドだから?
ROCKET_ENV=productionにしたらcriticalにはなったけど
環境変数使う場合もROCKET_接頭辞使ってるから意図しない競合はしなさそう
いやこれだけじゃわからないか。log::info!()とかの実装によるんだよな。
Configがlogger::try_initを呼んで、その中でlog::set_boxed_loggerを呼んでる
Riker
設定はriker.toml
DefaultConsoleLoggerというのがあって、println!()を使っている
内部ではslogを使っている。
↑のDefaultConsoleLoggerのprintln!()との関係は?
デフォルトはInfo
RUST_LOGで設定されちゃいそうな雰囲気あるけど実際どうなんだろう
ActorSystem::newやSystem builder::createの中でロガーを初期化していて、その中でslogを初期化している