トレース

 

Rob Howard
Microsoft Corporation

2001 年 1 月 25 日

ASP.NET に関するプレゼンテーションを行うたびに、新しいトレース機能がデモンストレーションされたときに観客をwatchすることは常に楽しいです。 ASP を使用してソリューションを構築したユーザーにとって、トレースは神の手です。

今月の列では、ASP.NET のトレース機能について説明します。 まず、ASP の一般的なトレース手法 Response.Write()について説明します。

ASP を使用したトレース

私のような場合は、ASP アプリケーションをコーディングするときに、コードの面倒なセクションを解剖するときに Response.Write() ステートメントを使用します。

この点を示す擬似コードを次に示します。

<%
On Error Resume Next 
Response.Write("About to do data access...")
Set objDB = Server.CreateObject("Custom.DataAccess")
objDB.Open("PersonalizationData")
user = objDB.Get("username")
Response.Write("Done calling data access. Value of username is:" + user)
%>

上記のコードの Response.Write() 呼び出しは非常に使い慣れているはずです。つまり、コードの動作に関するエラーが発生しています。 このエラーは、オブジェクトの読み込みエラーなど、必ずしもアプリケーションまたはシステム エラーではなく、コードが想定どおりに実行されるが、期待される値を返さないコーディング エラーです。

もちろん、デバッガーを使用することもできますが、場合によっては、トレース出力を取得してコードの実行内容を確認したり、コードの特定のセクションがどのように実行されているかを知らせたりする方が高速な場合があります。

Repsonse.Write() ステートメントを使用すると、アプリケーションを簡単に簡単にデバッグできますが、アプリケーションに不要なコードが導入され、デプロイされたアプリケーションが壊れる実際のバグが発生する可能性があります。 たとえば、一般に、作業中のコードに対する真の感情を表す可能性がある、よりカラフルな Response.Write() ステートメントを削除することを忘れた場合、それは良いことではありません。

もちろん、 Response.Write() ステートメントと同じ機能が ASP.NET 内でサポートされています。 実際、トレース機能を持っているにもかかわらず、 Response.Write() を使用していることに気が付きます。 古い習慣は壊れにくいです。

ただし、新しいトレース機能は ASP: デバッグ モードに存在しなかったものを提供するため、すべてのユーザーがこれらの古い習慣を破ろうとする必要があります。

ASP.NET を使用したトレース

ASP.NET の新しいトレース機能を使用すると 、Response.Write() ステートメントをシミュレートできますが、アプリケーションをデプロイする前に ステートメントを削除する心配はありません。 代わりに、上記と同じコードを記述しますが、 Response.Write()を使用する代わりに Trace.Write()を使用します

Trace オブジェクトは、RequestResponseServer などの組み込みページ オブジェクトになりました。これは、ページ コードを使用して直接アクセスできます。

Trace クラスを簡単に見てみましょう。

Trace クラス

トレース は、ASP.NET ページ内のパブリック プロパティとして公開されます。 Trace プロパティを使用する場合、System.Web 名前空間で定義されている TraceContext クラスのインスタンスを操作しています。

Trace クラスは、2 つのオーバーロードされたメソッドと 2 つのプロパティを公開します。 2 つのメソッドとWrite(),Warn()両方とも 2 つの同一のプロトタイプがサポートされています。

VB.NET

Public Sub [Warn | Write](category As String, 
                          message As String, 
                          errorInfo As Exception)
End Sub
Public Sub [Warn | Write](category As String, 
                          message As String)
End Sub

C#

public void [Warn | Write](String category, 
                           String message, 
                           Exception errorInfo)
public void [Warn | Write](String category, 
                           String message)

category パラメーターは、メッセージ値を書き込むカテゴリ名を識別するために使用されます。 これは、次の例で Write() メソッドを使用すると、より明らかになります。 オーバーロードされたメソッドで Warn()Write() の両方がサポートする 3 番目のパラメーターは errorInfo です。 これにより、例外の詳細をトレース システムに渡すことができます。

プロパティ

TraceContext クラスは、IsEnabledTraceMode の 2 つのパブリック プロパティをサポートしています。

  • IsEnabled は、ページまたはアプリケーションでトレースが有効になっているかどうかを示します。
  • TraceMode は、トレースで使用されている並べ替えモードを設定または返します。 アプリケーション レベルのトレースについて以下で説明する場合は、トレース モードの構成について説明します。

これで、TraceContext クラスでサポートされるクラスとメソッドとプロパティがどのようなものかを確認したので、Trace.Write() の例を見てみましょう。

<Script runat=server>
Public Function Add(a As Integer, b As Integer) As Integer
  Trace.Write("Inside Add() a: ", a.ToString())
  Trace.Write("Inside Add() b: ", b.ToString())
  return a + b
End Function
</Script>
Call the Add routine: 4 + 5 = <%=Add(4,5)%>

このコードを実行すると、出力は次のようになります。

図 1. Trace.Write() メソッドの例

明らかに Add () メソッドが呼び出されています。 ただし、 Repsonse.Write() ステートメントとは異なり、 Trace.Write() ステートメントは結果の出力内に表示されません。 Trace.Write() ステートメントの結果を表示するには、このページまたはアプリケーションのトレースを有効にする必要があります。

トレースを有効にするには、ページ ディレクティブまたは構成オプションを使用できます。 両方を見てみましょう。

ページ トレース ディレクティブ

ページ ディレクティブは、ASP.NET リソースの要求を処理するときに ASP.NET が使用する特別な命令です。 ページ ディレクティブは、ASP.NET ページの構成設定をオーバーライドまたは適用するために使用できます。

ディレクティブは、ページの最初の要素である必要があります。 これは、次の構文を使用して宣言されます。

<%@ Directive Attribute="[Value]" %>

上記の構文を使用して、ページでトレースを有効にすることを ASP.NET に指示する方法を次に示します。

<%@ Page Trace="true" %>

上記のディレクティブをサンプル コードに追加すると、ページ出力はかなり異なります。

図 2. トレースが有効

これで、トレース出力がページの下部に追加されます。 トレース出力は 常に ページの末尾に追加されます。

次に、アプリケーション レベルでトレースを有効にする方法を見てみましょう。 次に、トレース出力に含まれる内容について説明します。

アプリケーション トレース

ASP.NET では、XML 構成ファイルを使用して、ASP.NET アプリケーションの構成設定を設定します。 すべての ASP.NET インストールでは、config.web という名前の [システム ドライブ]\WinNt\Microsoft.NET\Framework\[バージョン]\ ディレクトリに構成ファイルがインストールされます。

構成ファイルは既定の ASP.NET 構成を設定し、ベータ 1 ではルート構成ファイルと呼ばれます。 このファイル内で行われた変更は、すべての ASP.NET Web アプリケーションに影響します。 また、Web アプリケーションで構成ファイルを使用して、既定の config.web から取得した設定を追加または削除することもできます。

今後の列で構成について詳しく説明します。 ここでは、ルート構成ファイルを使用して、すべての ASP.NET アプリケーションにトレース設定を適用します。

トレース セクション

ルート config.web ファイルを開くと、トレース セクションが見つかります。

<configuration>
    <trace
        enabled="false"
        requestlimit="10"
        pageoutput="false"
        tracemode="SortByTime"
    />
</configuration>

トレース要素には、次の 4 つの属性があります。

  • enabled = "[true/false]"— 有効なオプションを true または false に設定できます。 トレースは、アプリケーション レベルで有効になっているか、アプリケーション レベルで無効になっています。 enabled=false を設定した場合でも、前に説明した Trace ディレクティブを使用してページ トレースがサポートされます。
  • requestlimit = "[int]"—アプリケーションごとにメモリにキャッシュされた状態を維持するトレース要求の合計数。 トレースでは、 pageoutputfalse に設定されている場合にトレース出力を表示するために使用される特別なリソース Trace.axd が公開されます。
  • pageoutput = "[true/false]"構成ファイルを介してトレースが有効になっている場合、管理者は各ページでトレースを有効または無効にすることができます。 ページ出力トレースを使用すると、アプリケーション内のすべてのページのトレースの詳細が有効になります。 ただし、アプリケーション レベルのトレースがまだ有効になっている (true" が有効 = ") 場合は、ページ出力トレースがオフになる可能性があります。 これにより、trace.axd を介して使用できるように、トレース要求がメモリ内に保持されます。これは一時的に確認しますが、ページの出力内には表示されません。
  • tracemode = "[SortByTime |SortByCategory]"tracemode 設定を使用すると、トレース詳細情報の出力方法を制御できます。 データは時間またはカテゴリで並べ替えることができます。ここで、カテゴリは、システムによって行われた設定と、開発者が有効にする Trace.Write() 設定とで区別されます。 たとえば、このサンプルでは、Trace.Write(Inside Add(") a:", a.ToString())Trace.Write(). ステートメントの最初のパラメーターがカテゴリです。 この場合、カテゴリを Inside Add() a: として"定義しました"。 カテゴリ (tracemode = "SortByCategory") で並べ替えた場合、このアイテムは、トレース出力で通常のページ関数が呼び出される前に並べ替えられます。 一方、時間による並べ替えは、呼び出しに費やされた時間で並べ替えられます。

アプリケーション トレースの使用

上記の同じサンプル コードを使用して、ページ ディレクティブを削除し、トレース config.web 設定を変更して同じ機能を有効にすることができます。

<configuration>
    <trace
        enabled="true"
        requestlimit="10"
        pageoutput="true"
        tracemode="SortByTime"
    />
</configuration>

サンプル アプリケーションを呼び出して Page ディレクティブを削除し、同じ出力を取得できるようになりました。

図 3: トレースが有効で、Page ディレクティブがない

しかし、前に説明した機能を使用する場合は、トレースを有効にしてページの出力を無効にします。

<configuration>
    <trace
        enabled="true"
        requestlimit="10"
        pageoutput="false"
        tracemode="SortByTime"
    />
</configuration>

上記の構成設定でサンプル アプリケーションを要求した場合、トレースは有効のままですが、トレース出力は表示されません。 トレース出力を表示するには、trace.axd という特殊なアプリケーションを使用します。

Trace.axd

Trace.axd は Http ハンドラーです。 Http ハンドラーは、最も基本的なレベルで要求/応答を処理できるコーディング オプションです。 Http ハンドラーは、ISAPI 拡張機能と同等です。 ただし、ISAPI とは異なり、任意の .NET 言語を使用して作成できます。 Http ハンドラーについては、後の列で詳しく説明します。

Trace.axd は、アプリケーション トレースの詳細を要求するために使用できる Http ハンドラーです。 要求されると、最後の n 個の要求のトレース ログが表示されます。n は、構成ファイルの requestlimit="[int]" によって設定された値によって決定されます。

trace.axd を使用するには、サンプル アプリケーションの要求が行われたのと同じアプリケーション ディレクトリで trace.axd を要求するだけです。

図 4: アプリケーション トレース要求

スクリーン ショットからわかるように、表示できるトレースの一覧が表示されます。 これらのトレース ビューは、トレースがページに追加する詳細と同じですが、ページからの出力は含まれません。

図 5: 要求の詳細

トレースの構成と使用方法について説明したので、トレース出力について説明します。

トレース出力の解釈

Trace.axd またはページを介してトレース ビューによって提供される出力には、次の 6 つの詳細セクションが用意されています。

  • 要求の詳細 - これは、セッション ID、要求の時刻、Http 要求の種類、Http 応答状態コードなどの基本的な情報です。
  • トレース情報 - このセクションでは、カテゴリとメッセージのテーブル ビューを提供します。 コードで Trace.Write() ステートメントを使用する場合、 Trace.Write() で受け入れられる 2 つのパラメーターがそれぞれ Category 値と Message 値として使用されます。 さらに、最初から最後のバイトまでの時間が提供されます。
  • コントロール ツリー — この列ではまだ説明していませんが、ASP.NET はサーバー コントロールを使用して、アプリケーションを宣言的にビルドできるようにします。 [コントロール ツリー] セクションには、ページ内のコントロールに関する情報が表示されます。 コントロールの ID、型、レンダリング サイズ、およびビューステート サイズを指定します。 この情報により、使用しているコントロールと、関連するコスト (レンダリング サイズとビューステート) を把握できます。
  • Cookie コレクション - クライアントが要求ヘッダーで送信するすべての Cookie が解析され、その名前、値、サイズが表示されます。
  • Headers コレクション - このセクションでは、クライアントによってサーバーに提示される Http ヘッダーを示します。 これは、名前/値を一覧表示する単純なテーブルです。
  • サーバー変数 — [サーバー変数] セクションには、サーバー変数の名前と値のペア テーブルが表示されます。

トレースの使用

ご覧のように、トレースは、Web アプリケーションの開発を容易にするために設計された強力な新しい ASP.NET 機能です。 しかし、トレースを使用すべきで、使用すべきでないときにメンションすることも価値があると思いました。

デプロイされたアプリケーション

トレースは要求に追加のオーバーヘッドを追加し、デプロイされたアプリケーションに対して有効にしないでください。 ただし、Trace.Write() ステートメントは、トレースが有効になっていない場合は無視されるため、残すことができます。

データをキャプチャするデプロイ済みアプリケーションの場合は、 System.Diagnostics 名前空間にあるクラスを使用することをお勧めします。 これらのクラスは、今後の列で取り上げる予定ですが、Windows イベント ログに直接書き込むことができるようになります。

アプリケーションをビルドするときにトレースを確実に使用する必要がありますが、これらの Response.Write() ステートメントを削除したのと同様に、アプリケーションをデプロイする準備ができたら無効にする必要があります。

Trace.axd の無効化

運用 Web サーバーに ASP.NET をインストールしている場合は、Trace.axd を明示的に無効にすることをお勧めします。 ルート config.web ファイルを開き、 セクションを <httphandlers> 見つけて、次のエントリを追加します。

<configuration>
        <add verb="*" 
             path="trace.axd"
             type="System.Web.Handlers.TraceHandler" />
        <remove verb="*" path="trace.axd"/>
</configuration>

メモ: エントリ全体 <add/> を切り取ることもできますが <remove> 、このオプションはコードを構成ファイルに残し、同じ目標を達成し、trace.axd を無効にするため、より優れています。 これは、ASP.NET のベータ 2 で解決されます。

まとめ

ASP.NET のトレース機能は、アプリケーションの動作を追跡するための強力な新しい方法です。 以前は、 Response.Write() ステートメントを使用してアプリケーションを実行中にトレースしましたが、 Trace.Write() ステートメントを使用して、デプロイされたコードにこれらのステートメントを残すようになりました。 これにより、アプリケーションをデプロイする準備ができたときにコードを削除しないため、バグが少なくなります。

ASP.NET リソース

最後に、利用可能な新しい ASP.NET リソースをいくつか呼び出したいと思いました。 ASP.NET リソースの詳細については、こちらをご覧 https://www.asp.net ください。

Rob Howard は、.NET Framework チームの ASP.NET プログラム マネージャーです。 彼は彼の家族と一緒に持っているか、東ワシントンでフライフィッシングを持っている任意の空き時間を過ごします。