🗒️

Rustでログを出力しよう

2023/08/28に公開

はじめに

Rustのプログラムでログを出力できるようにしましょう!
いつかログ出力ライブラリはありますが、今回はtokioとの相性がよいtracingを使っていきます。

追加済みのコードはこちらにあります。
https://github.com/ao-39/rust_devcontainer/tree/add_logger

最速で環境を構築する場合

クローンすればすぐ環境を作成できます。

git clone https://github.com/ao-39/rust_devcontainer.git -b add_logger

VSCodeの左下の><のメニューからコンテナーのリビルドを選択すれば環境を立ち上げられます。

タイムゾーンを設定する

linuxの場合はdateコマンドを実行すれば時刻を確認できます。

VSCodeのDevcontainerを使っている場合のタイムゾーン変更方法

.devcontainer/docker-compose.ymlのRustのコンテナにタイムゾーンの環境変数を設定しましょう。

.devcontainer/docker-compose.yml
services:
  rust_devcontainer:
    ...
    environment:
      TZ: Asia/Tokyo

ライブラリを追加する

Cargo.toml
dotenvy = "0.15.7"
tracing = "0.1.37"
tracing-subscriber = { version= "0.3.17", features = ["std", "env-filter", "time", "local-time"]}

.envから環境変数を取得するためにdotenvyを追加します。

.envファイルにログレベルを追加する

RUST_LOG="DEBUG"

ERROR, WARN, INFO, DEBUG, TRACEを選べます。

ロガーの設定を追加する

use tracing_subscriber::{fmt::time::LocalTime, EnvFilter};
fn main() -> Result<(), Box<dyn std::error::Error>> {
    dotenvy::dotenv()?;
    tracing_subscriber::fmt()
        .with_timer(LocalTime::rfc_3339())
        .with_env_filter(EnvFilter::from_default_env())
        .with_file(true)
        .with_line_number(true)
        .init();
    tracing::info!("Hello, world!");
    Ok(())
}

以上で設定終了です。cargo runを実行することでログとしてHello, world!が表示されます。

おわりに

tracingは構造化ログや、非同期タスクの開始、終了時間も出力することができるなど、ロガーとして高機能になってます。様々な例にも使われていますので、今後もさわっていけたらと思います。

コラボスタイル Developers

Discussion