QA@IT

asp.net(VB)のトレースログ出力について

8161 PV

【環境】
VisualStudio2005
ASP.net
VB

既存のWEBアプリケーションでトレースログをファイルに出力したいと考えています。
例えば表示したい画面のaspxのソースの頭にtrace="true"と書くとトレース情報が
画面に表示されると思いますが、これをファイルに出力したいです。

調べたところ、TextWriterTraceListenerを使えばよいのかなと感覚的なレベルでしかないのですが、
アプリケーションルートのweb.configの<configuration>セクション内に以下を書いてみましたが、何も出力されません。

※周りは省略

  <system.diagnostics>
    <switches>
      <add name="General" value="4" />
    </switches>
    <trace autoflush="true" indentsize="2">
      <listeners>
        <remove name="Default" />
        <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="~/ErrorLog/tracelog.log" traceOutputOptions="ProcessId, LogicalOperationStack, Timestamp, ThreadId, Callstack, DateTime" />
      </listeners>
    </trace>
  </system.diagnostics>

間違いなく概念を理解していない気がするのですが、そもそもweb.config書いただけでは
トレースログは出ないのでしょうか。

その場合どのようにすればトレースログを出力できるのか
サンプルコードや考え方なども教えて頂けると助かります。

インターネット上で調べてみたのですが
よくわからずご教示頂けると助かります。
宜しくお願いします。

回答

VisualStudio2005 ということですから .NET 2.0 ですか?(そういう情報はきちんと書いてくださいね)

以下の記事は .NET 4 が対象とのことですが、たぶんログファイルに書き出すところは .NET 2.0 でも有効で、その記事の「すべてのトレース出力の .NET Framework トレースへのルーティング」のセクションが参考になると思います。

チュートリアル : ASP.NET トレースと System.Diagnostics トレースの統合
https://msdn.microsoft.com/ja-jp/library/b0ectfxd(v=vs.100).aspx

自分の環境(ASP.NET 4 Web Forms アプリ、Vista 32-bit の IIS7、Visual Studio 2010 Pro)で検証して期待通りログファイル(上の記事で言う Asptesttrace.log)にトレース情報は書き込まれることは確認済みです。(異なる .NET バージョン、開発サーバーや IIS Express では未検証です)

そもそもweb.config書いただけではトレースログは出ないのでしょうか。

従って、基本的には上記の理解(web.config の設定だけで可)は正しいです。

ただし、ログファイルに書き込まれる情報は、当たり前かもしれませんが、トレース情報だけです。(すなわち、@ Page ディレクティブで Trace="true" とした時にブラウザに表示される「トレース情報」の「カテゴリ」と「メッセージ」だけ。traceOutputOptions は無視されるようです。)

他の情報も表示する手段があって、自分がそれを知らないだけという可能性は否定し切れませんが、もし「カテゴリ」と「メッセージ」だけしかログに残せないとするとあまり役に立つとは思えないのですが・・・

【201510/13 12:35 追記】

プログラム側でタイムスタンプやIDなどを取って今回の出力トレースと組み合わせて有用なログを出せないかもう少しトライアンドエラーしてみます。

コードビハインドで取得できる情報であれば、紹介したチュートリアルを最初から読んでもらうと分かりますが、System.Diagnostics.Trace クラス(Page.Trace プロパティで取得できる TraceContext オブジェクトではない点に注意)を利用して書き込んだトレースメッセージを ASP.NET のトレース情報と統合してログファイルに書き込むことはできます。

(現時点の記事には、「Web フォームのトレース メッセージを書き込むには」のセクションのコード Trace.WriteLine が Trace.Write の間違い、WebPageTraceListener とコンパイラのバージョンが古いなどの問題があるので注意してください)

ただし、例外をログに残すのであれば、それを catch してトレース情報に書き込むようなことをするのではなく、Global.asax の Application_Error ハンドラ(特定のページだけならそのページの Page_Error ハンドラ)でログファイルに書き込むようにしたほうがいいと思います。

具体的な方法は以下の記事が参考になると思います。

方法 : アプリケーションレベルのエラーを処理する
https://msdn.microsoft.com/ja-jp/library/24395wz3(v=VS.100).aspx

エラー ハンドラの完全なコード例
https://msdn.microsoft.com/ja-jp/library/bb397417.aspx

編集 履歴 (3)
  • SurferOnWwwさん、情報不足大変失礼致しました。.netのバージョンは2.0となります。有用なアドバイスを頂きましてありがとうございます。system.webディレクティブでのルーティングが抜けてました。確かにこれだけだとあまり役に立たなそうですね。。プログラム側でタイムスタンプやIDなどを取って今回の出力トレースと組み合わせて有用なログを出せないかもう少しトライアンドエラーしてみます。 -
  • どういう情報をログに残したいかによりますね。コメント欄には書ききれないので解答欄に追記します。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。