2011-01-31 2 views
8

Trace.WriteTrace.TraceInformationの違いを理解しようとしています。トレースにユーザーフレンドリーなタイムスタンプを含める方法

タイムスタンプ/日時のためにtraceOutputOptionsを設定しようとしました。私は、私が書いている各メッセージと共にタイムスタンプを追加するだけでいいです。私が得ているdatetimeは、以下のように、アプリケーション名とあまりユーザーフレンドリーなタイムスタンプを次の行に追加するので少し混乱します。

ConsoleApplication1.exe Information: 0 : Hello - Trace! 
DateTime=2011-01-31T14:26:11.1538509Z 
ConsoleApplication1.exe Error: 0 : Hello - Trace! 
DateTime=2011-01-31T14:26:11.1538509Z 

私に必要なのは

2011-01-31 11:32 Information: Hello - Trace! 
2011-01-31 11:33 Error: Hello - Trace! 

のようなものがそれをやってApp.configでそれを設定するための簡単な方法はありますか?

+0

'Trace.Write'とそのilkは(" OutputDebugString "を使用して)トレースする"古い方法 "です。 "新しい方法"はTrace Sourcesです。http://msdn.microsoft.com/en-us/library/ms228989.aspx – Tergiver

答えて

1

codeplexのUkadc.Diagnosticsプロジェクトをご覧ください。組み込みのSystem.Diagnostics TraceListenersで実現できるものよりも強力な出力フォーマット機能(log4netやNLogに似ています)を提供する優れたSystem.Diagnosticsベースのアドオンパッケージを提供します。独自の書式設定/トークン・オブジェクトを作成し、出力書式設定プロセスに組み込むこともできます。

ライブラリは使いやすく、非常にうまく動作します。

私は私が(ConsoleTraceListenerを必要な2人のリスナーを継承しました(私を含めたSystem.Diagnosticsの機能は、すでに豊富だと思う)他の外部依存を必要とせず、

をより良い方法を見つけた

+0

リンクをありがとう。単純なことのために外部依存関係を含めるにはちょっと重いようです。私はそれを達成するためにトレースの中で何かを得ることを望んでいました。とにかくこのプロジェクトをcodeplexで調べます。 – imak

+0

@imak - 組み込みのTraceListenersには非常に柔軟な書式設定オプションがありません。あなたのための別のオプションは、あなた自身のTraceListenerを書いて、あなたが望むように書式を実装することです。 – wageoghe

10

そして、このようには、TextWriterTraceListener):

のApp.configで次に
namespace MyApp 
{ 
    namespace Diagnostics 
    { 
     public class DateTimeConsoleTraceListener : ConsoleTraceListener 
     { 
      public override void Write(string message) 
      { 
       base.Write(DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss.fffffff ") + message); 
      } 
     } 

     public class DateTimeTextWriterTraceListener : TextWriterTraceListener 
     { 
      public DateTimeTextWriterTraceListener(string fileName) : base(fileName) { } 

      public override void Write(string message) 
      { 
       base.Write(DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss.fffffff ") + message); 
      } 
     } 
    } 
} 

、:

<sharedListeners> 
    <add name="ConsoleListener" 
    type="MyApp.Diagnostics.DateTimeConsoleTraceListener, MyApp"> 
    <filter type="System.Diagnostics.EventTypeFilter" 
     initializeData="All"/> 
    </add> 
    <add name="FileListener" 
    type="MyApp.Diagnostics.DateTimeTextWriterTraceListener, MyApp" 
    initializeData="MyApp.log" > 
    <filter type="System.Diagnostics.EventTypeFilter" 
     initializeData="All"/> 
    </add> 
</sharedListeners> 

は、この情報がお役に立てば幸い!

+0

クールで、 'WriteLine(文字列メッセージ)'メソッドもオーバーライドする必要があります。そうしないと、トレースラインの一部にタイムスタンプが付きません。 – igorushi

+0

ConsoleTraceListenerとTextWriterTraceListenerの逆アセンブルされたコード(Reflectorなど)をチェックすると、WriteLineメソッドで単純にNewLine文字を追加してWriteメソッドを呼び出すことがStreamWriterクラスを内部的に使用することがわかります。したがって、WriteとWriteLineの両方をオーバーライドすると、WriteLineが呼び出されるたびに複製タイムスタンプが取得されます。 – Jamby

関連する問題