Rust:
ロギング

方法:

Rustで基本的なロギングシナリオをlogクレートを用いて設定してみましょう。これはロギングのファサードを提供し、env_loggerlogクレートのためのロギング実装です。まず、Cargo.tomlにそれらを追加します:

[dependencies]
log = "0.4.14"
env_logger = "0.9.0"

次に、main.rsでロガーをセットアップして初期化します:

use log::{info, warn};

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

    info!("これはインフォメーションメッセージです。");
    warn!("これは警告メッセージです。");
}

アプリをRUST_LOG=info cargo runで実行すると、出力が表示されます:

INFO: これはインフォメーションメッセージです。
WARN: これは警告メッセージです。

RUST_LOG環境変数をいじってみて、errorwarninfodebugtraceに設定することでログの詳細度を制御します。

深堀り

ロギングの概念は新しいものではありません。それはコンピューティングの初期からありました。ロギングがソフトウェアで一般的になる前は、開発者はプリント文やデバッガーツールなどの原始的な方法に依存してプログラムの実行を追跡しました。プログラムが複雑になるにつれて、ロギングの構造化されたアプローチへのニーズも高まりました。

Rustでは、logクレートはロギングの実装の詳細を抽象化し、異なるログバックエンドをプラグインすることを開発者に許可します。env_loggerは一般的な選択ですが、fernslog、またはtracingのようにそれぞれ独自の機能や構成オプションを持つ代替品があります。

ログの実装におけるいくつかの考慮事項には以下のものがあります:

  1. ログレベル:詳細度を制御することが重要です。Rustのlogクレートは、重大度の減少する順に、error、warn、info、debug、traceといういくつかのログレベルを定義しています。

  2. パフォーマンス:ログはパフォーマンスに影響を与える可能性があります。それを慎重に使用し、パフォーマンスに重要なパスでのログ記録を避けるか、本番環境での過度に詳細なログを避けることが重要です。

  3. 構造化ロギング:現代の最良の慣習には構造化ロギングが関与しています。これはログがJSONのような機械可読形式で書かれる場合です。slogのようなライブラリはRustでの構造化ロギングを可能にし、ELK StackやSplunkなどのログ管理システムを使用してインデックス作成および照会ができます。

  4. 非同期ロギング:主要なアプリケーションへの影響を最小限に抑えるために、ロギングは非同期で行うことができます。これは通常、ログライブラリがインメモリキューに書き込み、別のスレッドがキューを処理し、宛先にログを書き込むことによって達成されます。

  5. 配置:多くのロギングフレームワークは、環境変数、設定ファイル、および/またはコードを通じて設定をサポートしています。この柔軟性は、異なる環境(開発、ステージング、本番)で出力を微調整するための鍵です。

参照

  • logクレートのドキュメント:https://docs.rs/log/
  • env_loggerクレートのドキュメント:https://docs.rs/env_logger/
  • Rust by Exampleのログページ:https://doc.rust-lang.org/rust-by-example/std_misc/log.html
  • slogクレート、代替ロギングフレームワーク:https://github.com/slog-rs/slog
  • Tracing、Rustプログラムを計装するためのフレームワーク:https://crates.io/crates/tracing