トレース/ロギング
Rolldownのコードベースには多くのtracing::debug!
(またはtracing::trace!
)呼び出しがあり、多くの場所でログ情報を出力します。これらは、バグの位置を特定するだけでなく、コンパイラが特定の処理を行う理由を理解するためにも非常に役立ちます。
ログを表示するには、RD_LOG
環境変数をログフィルタに設定する必要があります。ログフィルタの完全な構文は、tracing-subscriber
のrustdocにあります。
使用方法
RD_LOG=debug [executing rolldown]
RD_LOG=debug RD_LOG_OUTPUT=chrome-json [executing rolldown]
ロギングの追加
PRにtracing::debug!
またはtracing::trace!
呼び出しを追加しても問題ありません。ただし、ログにノイズが発生しないように、tracing::debug!
またはtracing::trace!
の選択には注意する必要があります。
適切なログレベルを選択するためのいくつかのルールがあります。
- どのレベルを選択するかわからない場合は、
tracing::trace!
を使用してください。 - ログメッセージがバンドル中に1回だけ出力される場合は、
tracing::debug!
を使用してください。 - ログメッセージが1回だけ出力されますが、コンテンツのサイズはバンドル中の入力の規模に関連している場合は、
tracing::trace!
を使用してください。 - ログメッセージがバンドル中に複数回(ただし限定的)出力される場合は、
tracing::debug!
を使用してください。 - ログメッセージが入力の規模のために複数回出力される場合は、
tracing::trace!
を使用してください。
これらのルールは#[tracing::instrument]
属性にも適用されます。
- 関数がバンドル中に1回だけ呼び出される場合は、
#[tracing::instrument(level = "debug", skip_all)]
を使用してください。 - 関数が、入力の規模のために複数回呼び出される場合は、
#[tracing::instrument(level = "trace", skip_all)]
を使用してください。
重要事項
トレースする情報は主観的なものになる可能性があるため、レビュアーは、トレースステートメントを残すか、マージする前に削除するよう依頼するかを決定します。
関数レベルのフィルタ
Rolldownの多くの関数は、以下のように注釈が付けられています。
#[instrument(level = "debug", skip(self))]
fn foo(&self, bar: Type) {}
#[instrument(level = "debug", skip_all)]
fn baz(&self, bar: Type) {}
これにより、以下を一度に実行できます。
RUSTC_LOG=[foo]
すべてを一度に行います。
foo
へのすべての関数呼び出しをログに記録する- 引数をログに記録する(
skip
リストにある引数を除く) - 関数から戻るまで、(コンパイラの他の場所から)すべてをログに記録する
注意事項
引数のログ記録に正当な理由がない限り、一般的にskip_all
を使用することをお勧めします。
モジュール解決のトレース
Rolldownはoxc-resolverを使用しており、デバッグ目的でトレース情報を公開しています。
bash
RD_LOG='oxc_resolver' rolldown
これにより、oxc_resolver::resolve
関数のトレース情報が出力されます(例:)。
2024-06-11T07:12:20.003537Z DEBUG oxc_resolver: options: ResolveOptions { ... }, path: "...", specifier: "...", ret: "..."
at /path/to/oxc_resolver-1.8.1/src/lib.rs:212
in oxc_resolver::resolve with path: "...", specifier: "..."
入力値はoptions
、path
、specifier
であり、戻り値はret
です。