

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS SDK for Rust でのログ記録の設定と使用
<a name="logging"></a>

AWS SDK for Rust は、ログ記録に[トレース](http://tracing.rs/)フレームワークを使用しています。ログ記録を有効にするには、Rust アプリケーションで `tracing-subscriber` クレートを追加して初期化します。ログにはタイムスタンプ、ログレベル、モジュールパスが含まれており、API リクエストと SDK の動作のデバッグに役立ちます。`RUST_LOG` 環境変数を使用してログの詳細度を制御し、必要に応じてモジュールごとにフィルタリングします。

## AWS SDK for Rust でログ記録を有効にする方法
<a name="enableLogging"></a>

1. プロジェクトディレクトリのコマンドプロンプトで、[tracing-subscriber](https://crates.io/crates/tracing-subscriber) クレートを次の依存関係として追加します。

   ```
   $ cargo add tracing-subscriber --features tracing-subscriber/env-filter
   ```

   これにより、`[dependencies]` ファイルの `Cargo.toml` セクションにクレートが追加されます。

1. サブスクライバーを初期化します。通常、これは SDK for Rust オペレーションを呼び出す前に、`main` 関数の早い段階で行われます。

   ```
   use aws_config::BehaviorVersion;
   
   type BoxError = Box<dyn Error + Send + Sync>;
   
   #[tokio::main]
   async fn main() -> Result<(), BoxError> {
       tracing_subscriber::fmt::init();  // Initialize the subscriber.
       
       let config = aws_config::defaults(BehaviorVersion::latest())
           .load()
           .await;
   
       let s3 = aws_sdk_s3::Client::new(&config);
   
       let _resp = s3.list_buckets()
           .send()
           .await?;
   
       Ok(())               
   }
   ```

1. `RUST_LOG` 環境変数を使用して、ログ記録を有効化します。ログ情報の表示を有効化するには、コマンドプロンプトで、`RUST_LOG` 環境変数をログ記録しようとするレベルに設定します。次の例では、ログ記録のレベルを `debug` に設定します。

------
#### [ Linux/macOS ]

   ```
   $ RUST_LOG={{debug}}
   ```

------
#### [ Windows ]

   VSCode を使用している場合、ターミナルウィンドウのデフォルトは PowerShell です。使用しているプロンプトのタイプを確認します。

   ```
   C:\> set RUST_LOG={{debug}}
   ```

------
#### [ PowerShell ]

   ```
   PS C:\> $ENV:RUST_LOG="debug"
   ```

------

1. 以下のプログラムを実行します。

   ```
   $ cargo run
   ```

   コンソールまたはターミナルウィンドウに追加の出力が表示されます。

詳細については、`tracing-subscriber` ドキュメントの「[環境変数を使用したイベントのフィルタリング](https://docs.rs/tracing-subscriber/0.3.18/tracing_subscriber/fmt/index.html#filtering-events-with-environment-variables)」を参照してください。

## ログ出力の解釈
<a name="logging-understanding"></a>

前のセクションの手順に従ってログ記録を有効化すると、デフォルトで追加のログ情報が標準出力に表示されます。

デフォルトのログ出力形式 (トレースモジュールでは「full」と呼ばれます) を使用している場合、ログ出力に表示される情報は次のようになります。

```
2024-06-25T16:10:12.367482Z DEBUG invoke{service=s3 operation=ListBuckets sdk_invocation_id=3434933}:try_op:try_attempt:lazy_load_identity: aws_smithy_runtime::client::identity::cache::lazy: identity cache miss occurred; added new identity (took 480.892ms) new_expiration=2024-06-25T23:07:59Z valid_for=25066.632521s partition=IdentityCachePartition(7)
2024-06-25T16:10:12.367602Z DEBUG invoke{service=s3 operation=ListBuckets sdk_invocation_id=3434933}:try_op:try_attempt: aws_smithy_runtime::client::identity::cache::lazy: loaded identity
2024-06-25T16:10:12.367643Z TRACE invoke{service=s3 operation=ListBuckets sdk_invocation_id=3434933}:try_op:try_attempt: aws_smithy_runtime::client::orchestrator::auth: resolved identity identity=Identity { data: Credentials {... }, expiration: Some(SystemTime { tv_sec: 1719356879, tv_nsec: 0 }) }
2024-06-25T16:10:12.367695Z TRACE invoke{service=s3 operation=ListBuckets sdk_invocation_id=3434933}:try_op:try_attempt: aws_smithy_runtime::client::orchestrator::auth: signing request
```

各エントリには、以下の内容が含まれています。
+ ログエントリのタイムスタンプ。
+ エントリのログレベル。これは、`INFO`、`DEBUG`、または `TRACE` のような単語です。
+ ログエントリが生成された[スパン](https://docs.rs/tracing/latest/tracing/span/index.html)がネストされた集合で、コロン (":") で区切られています。これにより、ログエントリのソースを識別できます。
+ ログエントリを生成したコードを含む Rust モジュールパス。
+ ログメッセージテキスト。

トレースモジュールの標準出力形式は、ANSI エスケープコードを使用して出力を色分けします。出力のフィルタリングや検索を行う場合は、これらのエスケープシーケンスに注意してください。

**注記**  
ネストされたスパンの集合内に表示される `sdk_invocation_id` は、SDK によってクライアント側で生成される一意の ID で、ログメッセージを関連付けしやすくします。これは、AWS のサービス からのレスポンスで確認されたリクエスト ID とは無関係です。

## ログ記録レベルのファインチューニング
<a name="logging-control"></a>

`tracing_subscriber` などの環境フィルタリングをサポートするクレートを使用する場合は、モジュールごとにログの詳細度を制御できます。

すべてのモジュールに対して同じログレベルを有効化できます。以下は、各モジュールのログ記録レベルを `trace` に設定しています。

```
$ RUST_LOG={{trace}} cargo run
```

特定のモジュールのトレースレベルのログ記録を有効化できます。次の例では、`aws_smithy_runtime` からのログのみが `trace` レベルで入力されています。

```
$ RUST_LOG={{aws_smithy_runtime}}={{trace}}
```

複数のモジュールに異なるログレベルを指定するには、カンマで区切ります。次の例では、`aws_config` モジュールを `trace` レベルのログ記録に設定し、`aws_smithy_runtime` モジュールを `debug` レベルのログ記録に設定しています。

```
$ RUST_LOG={{aws_config}}={{trace}},{{aws_smithy_runtime}}={{debug}} cargo run
```

次の表は、ログメッセージのフィルタリングに使用できるモジュールの一部を示しています。


| プレフィックス | 説明 | 
| --- | --- | 
| `aws_smithy_runtime` | リクエストとレスポンスのワイヤログ記録 | 
| `aws_config` | 認証情報の読み込み | 
| `aws_sigv4` | リクエスト署名と正規リクエスト | 

ログ出力に含める必要があるモジュールを特定する 1 つの方法は、最初にすべてをログに記録し、次に必要な情報をログ出力で該当するクレート名を見つけることです。その後、対応する環境変数を設定することにより、プログラムを再度実行できます。