チュートリアル : ASP.NET トレースと System.Diagnostics トレースの統合
更新 : 2007 年 11 月
このチュートリアルでは、ASP.NET のトレース機能を System.Diagnostics トレース機能と統合し、すべてのトレース メッセージを 1 つのトレース出力に書き込む方法について説明します。
トレースを使用して、アプリケーションの実行の流れを追跡したり、Web フォームの有効期間中の重大なポイントのデータを表示したり、Web フォームがアプリケーションのさまざまな他のコンポーネントとどのように対話するかを調べたりできます。トレースを使用することにより、アプリケーションに送信された HTTP 要求パラメータ、特定の Web フォームのビュー ステートに格納されているメモリの量、およびその他の有益なプロファイル情報を調べることができます。
ASP.NET トレース機構は、ASP.NET Web ページと ASP.NET トレース ビューア (Trace.axd) に表示されるメッセージを記述します。これに対して、Trace クラスは、標準の .NET Framework トレース出力 (一般にコンソール ウィンドウ) にトレース メッセージを書き込みます。Web フォームがビジネス オブジェクトおよびその他のコンポーネントとやり取りする方法を簡単に追跡するには、ASP.NET トレース出力を System.Diagnostics トレースに統合してすべてのトレース メッセージをいずれかの出力にルーティングします。
ASP.NET トレースと Trace クラスの両方を使用する一般的な例としては、中間層ビジネス オブジェクトを使用してデータ、ビジネス ルール、およびトランザクション、キューなどの Enterprise Services を使用するページとやり取りする Web ページがあります。ビジネス コンポーネントやエンタープライズ コンポーネントはこのような状況でページを正しく実行するための主要な役割を果たすため、単一のトレース出力を使用してアプリケーションの複数の層にまたがるページの実行の流れを監視することが必要になります。
このチュートリアルでは、トレースを使用します。トレース メッセージを書き込むように Web ページとビジネス オブジェクトを変更した後で、すべてのメッセージを 1 つのトレース出力にルーティングします。
このチュートリアルでは、以下のタスクを行います。
Web ページにデータを返すことができるカスタム ビジネス コンポーネントを作成します。このコンポーネントは、XML ファイルからデータを読み取ります。
カスタム ビジネス オブジェクトをデータ ソースとして参照する Web ページを作成します。
ビジネス オブジェクトを参照している Web ページのトレースを有効にします。
ビジネス オブジェクトを参照している Web ページにトレース メッセージを書き込みます。
カスタム ビジネス オブジェクトに Trace メッセージを書き込みます。
すべてのトレース メッセージを 1 つの出力に書き込むように ASP.NET アプリケーションを構成します。
トレース出力を読み取ります。
前提条件
このチュートリアルを実行するための要件は次のとおりです。
- Microsoft .NET Framework と既存の ASP.NET Web サイト
メモ : |
---|
このチュートリアルは、開発者が Microsoft Visual Web Developer Web 開発ツールや Microsoft Visual Studio などのデザイナを使用していることを想定していません。 |
Web ページとビジネス オブジェクトの作成
このチュートリアルでは、Default.aspx Web ページ、AuthorClass ビジネス オブジェクト、および Authors.xml XML データ ファイルを作成します。これらは、トレースに関して説明するこのチュートリアルの後の手順で必要となります。
ソース コードをコピーして、ASP.NET ディレクトリ内のファイルに貼り付けできます。これにより、Default.aspx Web ページ、AuthorClass ビジネス オブジェクト、および Authors.xml ファイルを作成します。
Default.aspx ページを作成するには
テキスト エディタ (メモ帳など) を開き、新しいファイルを作成します。
次のコードをファイルに入力します。
<%@ Page Language="VB" %> <html> <form runat="server"> <asp:objectdatasource id="AuthorsObjectDataSource" runat="server" typename="PubsClasses.AuthorClass" selectmethod="GetAuthors"/> <asp:gridview id="GridView1" runat="server" datasourceid="AuthorsObjectDataSource" /> </form> </html>
<%@ Page Language="C#" %> <html> <form runat="server"> <asp:objectdatasource id="AuthorsObjectDataSource" runat="server" typename="PubsClasses.AuthorClass" selectmethod="GetAuthors"/> <asp:gridview id="GridView1" runat="server" datasourceid="AuthorsObjectDataSource" /> </form> </html>
ファイルに Default.aspx という名前を付けて、ASP.NET アプリケーションのルート ディレクトリに保存します。
Default.aspx ページは、AuthorClass という名前のビジネス オブジェクトを使用して XML データと対話します。
AuthorClass ビジネス オブジェクトを作成するには
アプリケーションのルート ディレクトリの下に、App_Code という名前のディレクトリを作成します。
テキスト エディタ (メモ帳など) で新しいファイルを開きます。
次のコードをファイルに入力します。
Imports Microsoft.VisualBasic Imports System Imports System.Web Imports System.Data Namespace PubsClasses Public Class AuthorClass Private dsAuthors As DataSet = _ New System.Data.DataSet("ds1") Private filePath As String = _ HttpContext.Current.Server.MapPath("~/App_Data/authors.xml") Public Sub New() dsAuthors.ReadXml(filePath, Data.XmlReadMode.ReadSchema) End Sub Public Function GetAuthors() As DataSet Return dsAuthors End Function End Class End Namespace
using System; using System.Web; using System.Data; namespace PubsClasses { public class AuthorClass { private DataSet dsAuthors = new DataSet("ds1"); private String filePath = HttpContext.Current.Server.MapPath("~/App_Data/authors.xml"); public AuthorClass() { dsAuthors.ReadXml (filePath, XmlReadMode.ReadSchema); } public DataSet GetAuthors () { return dsAuthors; } } }
ファイルに AuthorClass.cs (C# の場合) または AuthorClass.vb (Microsoft Visual Basic の場合) という名前を付けて、App_Code ディレクトリに保存します。
AuthorClass が使用するデータ ファイルは Authors.xml です。
トレースを有効にして ASP.NET トレース メッセージを表示するには
アプリケーションのルート ディレクトリの下に、App_Data という名前のディレクトリを作成します。
テキスト エディタ (メモ帳など) で新しいファイルを開きます。
次の XML データをファイルに入力します。
この XML ファイルは、データのデータベース構造を識別するスキーマ情報を含んでいます。これには、キーの主キー制約が含まれます。
メモ : ビジネス コンポーネントは、アプリケーションに適した任意の方法でデータを操作できます。このチュートリアルでは、便宜上、XML ファイルを使用します。
<?xml version="1.0" standalone="yes"?> <dsPubs xmlns="http://www.tempuri.org/dsPubs.xsd"> <xs:schema id="dsPubs" targetNamespace="http://www.tempuri.org/dsPubs.xsd" xmlns:mstns="http://www.tempuri.org/dsPubs.xsd" xmlns="http://www.tempuri.org/dsPubs.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified"> <xs:element name="dsPubs" msdata:IsDataSet="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="authors"> <xs:complexType> <xs:sequence> <xs:element name="au_id" type="xs:string" /> <xs:element name="au_lname" type="xs:string" /> <xs:element name="au_fname" type="xs:string" /> <xs:element name="au_phone" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> <xs:unique name="Constraint1" msdata:PrimaryKey="true"> <xs:selector xpath=".//mstns:authors" /> <xs:field xpath="mstns:au_id" /> </xs:unique> </xs:element> </xs:schema> <authors> <au_id>172-32-1176</au_id> <au_lname>White</au_lname> <au_fname>Gerry</au_fname> <au_phone>408 496-7223</au_phone> </authors> <authors> <au_id>213-46-8915</au_id> <au_lname>Green</au_lname> <au_fname>Marjorie</au_fname> <au_phone>415 986-7020</au_phone> </authors> </dsPubs>
ファイルに Authors.xml という名前を付けて App_Data ディレクトリに保存し、ファイルを閉じます。
Web ページとビジネス オブジェクトへのトレース メッセージの追加
Default.aspx ページ、Authors.xml データ ファイル、および AuthorClass ビジネス オブジェクトを作成したら、トレースを操作できます。コードにトレース メッセージを追加する前に、Default.aspx ページのトレースを有効にします。
トレースを有効にして ASP.NET トレース メッセージを表示するには
テキスト エディタ (メモ帳など) で Default.aspx ページを開きます。
Trace 属性を @ Page ディレクティブに追加し、Trace を true に設定します。
この宣言により、Web ページの ASP.NET トレースが有効になります。
詳細については、「方法 : ASP.NET ページのトレースを有効にする」を参照してください。
これでページのトレースが有効になり、Web ブラウザでページを表示すると、GridView コントロールの後ろにトレース出力が表示されます。2 番目に表示されるトレース テーブル ([トレース情報]) には、Web ページの実行パスに関する詳細情報が表示されます。
トレース出力の読み取り方法の詳細については、「ASP.NET トレースの情報の読み取り」を参照してください。
トレース メッセージの書き込み
Default.aspx ページの GridView コントロールによって実行されるデータ バインディングなど、ASP.NET のいくつかの基本アクションがどこで発生するかをより深く理解するために、Web ページと AuthorClass ビジネス オブジェクトにトレース メッセージを追加します。
Web フォームのトレース メッセージを書き込むには
Default.aspx Web ページで、@ Page ディレクティブの後ろ、<html> タグの前に、次のコードを入力します。
<script runat="server"> Private Sub Page_Load(sender As Object, e As EventArgs) Trace.WriteLine("ASP.NET TRACE","page_load called.") Trace.WriteLine("ASP.NET TRACE","page_load finished.") End Sub ' Page_Load </script>
<script runat="server"> private void page_load(object sender, EventArgs e) { Trace.WriteLine("ASP.NET TRACE","page_load called."); Trace.WriteLine("ASP.NET TRACE","page_load finished."); } </script>
メモ : 使用する言語によっては、@ Page ディレクティブに言語属性を含める必要があります。
これらのトレース メッセージは、ASP.NET トレース出力に書き込まれます。Default.aspx ページを再び表示すると、[トレース情報] セクションの "Begin Load" と "End Load" の間にトレース メッセージが表示されます。"Begin Load" と "End Load" は、Page_Load メソッドに関連付けられています。
次に、トレース メッセージを AuthorClass ビジネス オブジェクトに追加します。
トレース メッセージを AuthorClass ビジネス オブジェクトに書き込むには
AuthorClass コンストラクタに次のコードを入力します。
System.Diagnostics.Trace.Write("AuthorClass is created.", "AUTHORCLASS TRACE")
System.Diagnostics.Trace.Write("AuthorClass is created.", "AUTHORCLASS TRACE");
AuthorClass.GetAuthors メソッドに次のコードを入力します。
System.Diagnostics.Trace.Write("GetAuthors called.","AUTHORCLASS TRACE")
System.Diagnostics.Trace.Write("GetAuthors called.","AUTHORCLASS TRACE");
メモ : ASP.NET TraceContext.Write メソッドを使用すると、メソッドのパラメータ リストで、トレース メッセージの前にトレース カテゴリが表示されます。これに対して、.NET Framework の Write トレース メソッドを使用した場合は、トレース カテゴリの前にトレース メッセージが表示されます。
TRACE コンパイラ オプションを持つビジネス オブジェクトをコンパイルした場合、これらのトレース メッセージはシステム トレース出力に書き込まれます。トレース メッセージは、ASP.NET トレース メッセージのように Default.aspx ページには書き込まれません。これをテストするには、Default.aspx ページを表示し、前に表示した [トレース情報] テーブルに同じ "ASP.NET TRACE" メッセージしか表示されていないことを確認します。
次のセクションでは、TRACE オプションを有効にして自動コンパイルし、すべてのトレース メッセージを Web ページにルーティングするように ASP.NET Web アプリケーションを構成する方法について説明します。
すべてのトレース出力の Web フォームへのルーティング
AuthorClass ビジネス オブジェクトに含まれている Trace メッセージを ASP.NET トレース出力にルーティングすると、要求処理のどの時点で AuthorClass が作成され操作されたかを知ることができ、アプリケーションが実行している処理を全体的に把握できます。Trace メッセージを ASP.NET Web ページにルーティングするには、WebPageTraceListener オブジェクトを追加する必要があります。トレース リスナは、構成 (推奨) またはプログラムで追加できます。構成でトレース リスナを追加する方法の詳細については、「<trace> の <listeners> 要素」を参照してください。
次の手順では、Web.config ファイルが必要となります。既に Web.config ファイルがある場合は、次の手順を省略し、その次の WebPageTraceListener オブジェクトを追加する手順に進んでください。
Web.config ファイルを作成するには
テキスト エディタ (メモ帳など) を開き、新しいファイルを作成します。
次のテキストをファイルに入力します。
<!-- Web.Config Configuration File --> <configuration> <system.web> <customErrors mode="Off"/> </system.web> </configuration>
ファイルに Web.config という名前を付けて、Default.aspx と同じディレクトリに保存します。
次に、アプリケーションに WebPageTraceListener オブジェクトを追加して、Trace メッセージを ASP.NET トレース出力にルーティングします。
構成でアプリケーションの WebPageTraceListener を追加するには
アプリケーションの Web.config ファイルを開きます。
Web.config ファイルの <system.web> セクションの後に次のコードを配置します。
<system.diagnostics> <trace> <listeners> <add name="WebPageTraceListener" type="System.Web.WebPageTraceListener, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> </listeners> </trace> </system.diagnostics>
この構成セクションは、アプリケーションのトレース リスナのコレクションに WebPageTraceListener オブジェクトを追加します。
アプリケーションの構成ファイルを使用して WebPageTraceListener を追加する方法は、トレース リスナを追加するときに推奨される方法です。しかし、プログラムでもトレース リスナを追加できます。この方法は、アプリケーションのトレースに複雑なトレース論理とさまざまな種類のトレース リスナを使用していて、WebPageTraceListener が多数あるトレース リスナの 1 つにすぎない場合には特に便利です。
プログラムでアプリケーションにトレース リスナを追加する場合は、次の手順に従って Global.asax ファイルを作成し、リスナを追加します。
Global.asax ファイルを作成してプログラムでトレース リスナを追加するには
テキスト エディタ (メモ帳など) を開き、新しいファイルを作成します。
次のコードをファイルに入力します。
<%@ Application Language="VB" %> <%@ Import Namespace="System.Web" %> <script runat="server"> Sub Application_Start(sender As Object, e As EventArgs) ' Code that runs when the application is started. End Sub Sub Application_End(sender As Object, e As EventArgs) ' Code that runs when the application shuts down. End Sub </script>
<%@ Application Language="C#" %> <%@ Import Namespace="System.Web" %> <script runat="server"> void Application_Start(Object sender, EventArgs e) { // Code that runs when the application is started. } void Application_End(Object sender, EventArgs e) { // Code that runs when the application shuts down. } </script>
ファイルに Global.asax という名前を付けて、アプリケーションのルート ディレクトリに保存します。
これにより、基本の Global.asax が作成されます。これは、アプリケーションが開始または停止されるたびに実行されるコードを含む、コンパイル済みのモジュールです。
Global.asax ファイルの Application_Start メソッドに次のコードを入力します。
' Create a trace listener for Web forms. Dim gbTraceListener As New WebPageTraceListener() ' Add the event log trace listener to the collection. System.Diagnostics.Trace.Listeners.Add(gbTraceListener)
// Create a trace listener for Web forms. WebPageTraceListener gbTraceListener = new WebPageTraceListener(); // Add the event log trace listener to the collection. System.Diagnostics.Trace.Listeners.Add(gbTraceListener);
これにより、プログラムでアプリケーションのトレース リスナのコレクションに WebPageTraceListener が追加されます。
ファイルに Global.aspx という名前を付けて、Default.aspx と同じディレクトリに保存します。
上記の手順により、アプリケーションのトレース リスナのコレクションに WebPageTraceListener が追加されます。ASP.NET はページのトレースが有効にされているときにトレース メッセージを表示しますが、System.Diagnostics トレース メッセージが書き込まれるのは、トレース メッセージを含むコードが明示的なコンパイラ スイッチ (TRACE スイッチ) を使用してコンパイルされている場合のみです。つまり、TRACE スイッチを使用して AuthorClass を明示的にコンパイルしなければ、WebPageTraceListener を追加してもトレース メッセージは表示されません。
Web.config ファイルに新しいセクションを追加することにより、TRACE スイッチを使用して自動コンパイルするようにアプリケーションを構成できます。
トレースを有効にしてアプリケーションを自動コンパイルするには
アプリケーションの Web.config ファイルを開きます。
Web.config ファイルの <system.diagnostics> セクションの後に次のコードを配置します。
<system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" compilerOptions="/d:TRACE" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="1" /> <compiler language="VB" extension=".vb" compilerOptions="/d:Trace=true" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </compilers> </system.codedom>
既定では、この構成セクションは、アプリケーションのすべてのモジュールで TRACE オプションを使用してコンパイルします。
ここで Default.aspx ページを表示すると、ASP.NET トレース メッセージと System.Diagnostics トレース メッセージの両方が表示されます。ASP.NET トレース メッセージと System.Diagnostics トレース メッセージが表示されない場合は、AuthorClass オブジェクトを再コンパイルする必要があります。
トレース情報からは、Web ページの有効期間の PreRender メソッドの実行中に AuthorClass オブジェクトが作成され、その GetAuthors メソッドが呼び出されたことがわかります。また、AuthorClass オブジェクトの作成時にかなりのタイム ラグがある ("Begin PreRender" メッセージと "AuthorClass が作成されました。" メッセージの間の時間の差がかなり大きい) こともわかります。これは、AuthorClass の作成時に Authors.xml ファイルが開かれ、その DataSet が初期化されるためであり、この操作には比較的時間がかかります。
次のセクションでは、すべてのトレース メッセージを .NET Framework トレース出力にルーティングするように ASP.NET Web アプリケーションを構成する方法について説明します。
すべてのトレース出力の .NET Framework トレースへのルーティング
ASP.NET トレース メッセージを Trace メッセージの標準出力 (コンソール ウィンドウ、ディスク、Windows イベント ログ、またはその他のトレース メッセージ出力) にルーティングすることが必要になることもあります。このメッセージ ルーティングは、Web.config 構成ファイルで有効にできます。
すべての ASP.NET トレース メッセージをシステム トレース出力にルーティングするには
アプリケーションの Web.config ファイルを開きます。
新しい属性 writeToDiagnosticsTrace を <system.web> の下のトレース要素に追加した後で、writeToDiagnosticsTrace を true に設定します。
<system.web> <trace writeToDiagnosticsTrace="true"/> <customErrors mode="Off"/> </system.web>
この構成属性は、ASP.NET トレース メッセージを標準のシステム トレース出力機構にルーティングするように ASP.NET トレースに指示します。
ASP.NET トレース メッセージと System.Diagnostics トレース メッセージを ASP.NET ページの外部のコンテキストで表示するには、TextWriterTraceListener オブジェクトを使用してトレース メッセージをファイルに書き込みます。
TextWriterTraceListener オブジェクトは、特定のファイルに書き込むように構成する必要があります。これを行うには、<trace> の <listeners> の <add> 要素 の initializeData 属性を使用します。
このチュートリアルで前に示した「すべてのトレース出力の Web フォームへのルーティング」の 2 番目の手順で WebPageTraceListener オブジェクトを追加するために実行したのと同じ手順を実行して、Web.config ファイルに TextWriterTraceListener オブジェクトを追加し、アプリケーションのルート ディレクトリにある Asptesttrace.log という名前のファイルに書き込むように TextWriterTraceListener を構成します。
Global.asax ファイルに WebPageTraceListener をプログラムで追加しなかったと想定すると、Web.config ファイルの <system.diagnostics> セクションは次のようになります。
<system.diagnostics> <trace autoflush="true"> <listeners> <add name="WebPageTraceListener" type="System.Web.WebPageTraceListener, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> <add name="TestTracer" type="System.Diagnostics.TextWriterTraceListener, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="<app root directory>\Asptesttrace.log" /> </listeners> </trace> </system.diagnostics>
メモ : 前の手順で使用した initializeData 属性は、ASP.NET アプリケーションのルート ディレクトリのプレースホルダ値を持ちます。トレース メッセージをアプリケーションのルート ディレクトリ以外のファイルに書き込もうとすると、セキュリティ例外が発生します。既定では、ASP.NET ではアプリケーションのルート ディレクトリ (C:\ など) の外にあるディスク上の場所にファイルを書き込むことはできません。また、ASP.NET ワーカー プロセス アカウントにトレース ログへの書き込みアクセス許可を与える必要があります。
既定では、トレース データが対象のストリームに書き込まれる前に、トレース バッファが読み込まれるのを待つ必要があります。
ASP.NET ページを要求した直後にトレース ログのトレース データを表示するには、前の手順と同様に autoflush 属性を true に設定して、トレースの書き込みごとにバッファをフラッシュします。
autoflush 属性の既定値は false です。
トレース情報のバッファをプログラムでフラッシュするには、Flush メソッドを呼び出します。
メモ : このチュートリアルで作成したビジネス オブジェクトでは、Page_Load メソッド内で Flush メソッドを呼び出し、autoflush 属性が false に設定されている場合、トレース データがトレース ログに表示されません。これは、ビジネス オブジェクトがページの Load イベントが発生した後でレンダリングされるためです。
次の手順
このチュートリアルでは、ASP.NET および System.Diagnostics のトレース機能を使用して、すべてのトレース メッセージを単一の出力にルーティングする方法を示しました。ここに示した以外のトレース リスナ、トレース出力、および ASP.NET インストルメンテーション機能を試す必要があることもあります。たとえば、次のことが必要になる場合があります。
アプリケーションに EventLogTraceListener オブジェクトを追加します。
これを行うには、プログラムで、または WebPageTraceListener と同じプロシージャを使用する構成ファイルを使用して、EventLogTraceListener オブジェクトを追加します。イベント ログを開くと、アプリケーションがイベント ログに書き込むトレース メッセージを確認できます。
XML ファイルではなくデータベース データを使用するようにビジネス コンポーネントを変更します。ページ上のコントロールを変更する必要はありません。