2011-01-19 9 views
3

本番環境でのみ発生するパフォーマンスの問題を追跡しようとすると、アプリケーション内でトレースを有効にしているため、メソッド呼び出しとページ読み込み時間が表示されます。Trace.axdのデータをtext/xmlファイルに記録する

これはうまくいっており、問題を追跡するのに役立つ多くの情報があります。ただし、この情報を表示する唯一の方法は、Trace.axdを参照し、各要求を個別に表示することです。

この方法で最初のX要求を追跡することも可能であり、Xには最大10,000個の制限があります。

このトレース情報をファイルまたはデータベースに送る方法はありますか?私はこれがSystem.Diagnosticsを使用して行うことができると信じていますが、私は多くの運がないです。

私はこれのようなトレース項目のタイムスタンプとデータを含むXMLファイルになり

<system.diagnostics> 
    <trace autoflush="true"> 
     <listeners> 
     <add 
      name="XmlWriterTraceListener" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData="c:\trace.xml" 
      /> 
     </listeners> 
    </trace> 
    </system.diagnostics> 

を使用してXmlWriterTraceListener使用して試してみました

<trace enabled="true" writeToDiagnosticsTrace="true" /> 

使用してトレースを有効にしている「のロードを開始します"、" End Load "など。

ただし、単一の要求を記録するように見え、すべての要求は記録されません。さらに、ロード時間は便利ですが、理想的には、リクエストデータ、ポストデータ、セッションデータなど、Trace.axdで見ることができるすべての情報を利用したいと考えています。

これはですか?メジャーコードを変更しなくても可能ですか?理想的には、web.configの変更だけを使用してこれを有効にしたいと思います。

また、私はRedGateやEquatecのプロファイリングツールなどの他のアプリケーションも検討しましたが、まず非侵襲的なトレースオプションを使いたいと思います。

アプリケーションはASP.Net 3.5とC#で書かれています。

答えて

4

標準のHttpModuleを使用して、すべてのWebアプリケーションでパフォーマンスを監視しています。使用されるロガーは変更できます。ソースから空白を削除したり、圧縮したり、一定の限度に達すると電子メールを送信したりすることもできます。あなたが決定した情報だけを取得するので、asp.netのトレースを辿るほうが簡単です。

public class PerfHttpModule : IHttpModule { 

    private static Common.Logging.ILog log = Common.Logging.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
    public static readonly string CONTEXT_RequestStart = "PerfHttpModule_RequestStart"; 
    public static readonly string CONTEXT_RequestId = "PerfHttpModule_RequestId"; 

    public void Init(HttpApplication context) { 
     context.BeginRequest += new EventHandler(context_BeginRequest); 
     context.EndRequest += new EventHandler(context_EndRequest); 
    } 

    private void context_BeginRequest(object sender, EventArgs e) { 
     try { 
      if (HttpContext.Current != null) { 
       HttpContext.Current.Items[CONTEXT_RequestStart] = DateTime.Now; 
       HttpContext.Current.Items[CONTEXT_RequestId] = random.Next(999999).ToString("D6"); 
       log.Info("Url: " + HttpContext.Current.Request.Url + " (" + HttpContext.Current.Request.ContentLength + ")"); 
      } 
     } catch { 
     } 
    } 

    private void context_EndRequest(object sender, EventArgs e) { 
     if (HttpContext.Current.Items.Contains(CONTEXT_RequestStart)) { 
      DateTime time1 = (DateTime)HttpContext.Current.Items[CONTEXT_RequestStart]; 
      DateTime time2 = DateTime.Now; 
      double ms = (time2 - time1).TotalMilliseconds; 
      log.Info("TotalMilliseconds: " + ms); 
      if (ms > AppSettings.SlowPage || ms > AppSettings.ErrorSlowPage) { 
       StringBuilder sb = new StringBuilder(); 
       sb.Append("Slow page detected." + "\t"); 
       sb.Append("TotalMilliseconds: " + ms + "\t"); 
       sb.Append("Url: " + HttpContext.Current.Request.Url.ToString()); 
       if (ms > AppSettings.ErrorSlowPage) { 
        log.Error(sb.ToString()); 
       } else if (ms > AppSettings.SlowPage) { 
        log.Warn(sb.ToString()); 
       } 
      } 
     } 
    } 
} 

UPDATE

 if (HttpContext.Current != null) { 
       NameValueCollection tmp = new NameValueCollection(HttpContext.Current.Request.ServerVariables); 
       foreach (string i in tmp.Keys) { 

       } 
      if (HttpContext.Current.Server != null) { 
       if (HttpContext.Current.Server.GetLastError() != null) { 

       } 
      } 
      if (HttpContext.Current.Session != null) { 
       foreach (string i in HttpContext.Current.Session.Keys) { 

       } 
      } 
      if (HttpContext.Current.Request.Cookies != null) { 
       foreach (string i in HttpContext.Current.Request.Cookies.Keys) { 

       } 
      } 
      if (HttpContext.Current.Response.Cookies != null) { 
       foreach (string i in HttpContext.Current.Response.Cookies.Keys) { 

       } 
      } 
      if (HttpContext.Current.Items != null) { 
       foreach (string i in HttpContext.Current.Items.Keys) { 

       } 
      } 
      if (HttpContext.Current.Request.Form != null) { 
       foreach (string i in HttpContext.Current.Request.Form.Keys) { 

       } 
      } 
     } 
+0

+1、私はこれが好きで、私たちのアプリでうまく実装するかもしれません。しかし、私が後にしたことの1つは、ポストとセッションのデータを含めて、リクエストに関する可能な限り多くの情報でした。特定のページが遅いことがわかりましたが、問題の原因となっているアクションを実行しているユーザーがいます。現在のところ、どんな情報が役に立つのかわからないので、パターンを見つけるためにすべての情報を見たいと思っています。 –

+0

私は使用しているダンプコードを添付しました。私は通常、警告/エラーごとにhtmlファイルを作成します。 – djeeg

2

トレースデータは、カバーの下に、標準的なデータセットです。あなたは(4に.NET 2で動作しているようです)正式にそれを手に入れるが、ここでそれを行うことができますハックですができません。

public static DataSet GetTraceData(Page page) 
{ 
    if (page == null) 
     throw new ArgumentNullException("page"); 

    return (DataSet)typeof(TraceContext).GetField("_requestData", 
      BindingFlags.NonPublic | BindingFlags.Instance).GetValue(page.Trace); 
} 

あなたはDataSetをしたら、あなたは何を行うことができますXMLファイル(DataSet.WriteXml)、ストリームなどに保存します。

もちろん、内部フィールドを使用するため、今後サポートされない可能性があります。

関連する問題