2011-08-05 14 views
2

私はカスタムTraceListenerに問題があります。問題は、単一のトレースラインを書くことが、Write()とWriteLine()の2つの呼び出しを生成することです。 Write()の呼び出しには、トレース・ソース、レベル、およびイベントIDが含まれています。 WriteLine()への呼び出しは実際のメッセージですカスタムTraceListenerと複数のメッセージ

トレースリスナーは一度しかインスタンス化されていないようですので、最初の呼び出しをWrite()にキューすることはできません。 2つの呼び出しを相互に関連付ける方法がないように見えます。残念ながら、これは問題です。リモートサービスに2つのメッセージを送信し、オーバーヘッドを倍増させるからです。

コールをフィルタリングする一般的な方法はありません。私は、ソースとレベルで呼び出しを無視するだけで受け入れますが、それは非常にしやすいかもしれないようです。ここで

は、コードのサンプル片です:

/// <summary> 
/// When overridden in a derived class, writes the specified message to the listener you create in the derived class. 
/// </summary> 
/// <param name="message">A message to write. </param><filterpriority>2</filterpriority> 
public override void Write(string message) 
{ 
     _client.Post(message); 
} 


/// <summary> 
/// When overridden in a derived class, writes a message to the listener you create in the derived class, followed by a line terminator. 
/// </summary> 
/// <param name="message">A message to write. </param><filterpriority>2</filterpriority> 
public override void WriteLine(string message) 
{ 
     _client.Post(message); 
} 

使い方である:

private static readonly TraceSource Ts = new TraceSource("Source"); 

Ts.TraceEvent(TraceEventType.Error, 0, "Error Message"); 

は(書くの呼び出しが生成されます)を持つ:

"Source: Error: 0"

そしてコールWriteLine()に

"Error Message"

2つのメッセージを組み合わせることはできますか?または、最初のフィルタをかけるだけですか?ありがとう!

+0

全体のTraceListener? WriteおよびWriteLineメソッド以外に、コードのどこかに問題がある可能性があります。コンソールやデバッガなどに書き込むだけの簡単なTraceListenerを作成することもできます。あなたがそれを得ることができるかどうかを見て、Webサービスベースのものが動作しない理由に取り組んでください。また、System.Diagnosticsを使用している場合は、このプロジェクトを使用してlog4netとNLogでできることに似た独自の書式設定機能を使用することを検討することもできます。 http://ukadcdiagnostics.codeplex.com/ – wageoghe

+0

私は同じ動作をして、私の書き込みと書き込みのブレークポイントを押すだけで私はとてもシンプルです。私はまた、2つの呼び出しでメッセージが来るのを見る。あなたは解決策を見つけましたか? –

+0

私はお詫びします、私は私の質問に答えるべきでした。私は解決策を見つけましたが、私はそれを完全に理解していませんでした。ちょうど私が掲示した答えとgithubのリンクをチェックしてください。 – mfanto

答えて

0

2つの異なる形式の2つのメッセージがあります。これらの書き込み先はどこですか?これはEnterprise Loggingブロックを使用していますか?その場合は、設定ファイルを確認する必要があります。リスナーが2回登録されている可能性があります。

+0

これは外部サービスへの書き込みです。 _client.Post()はWebサービス呼び出しを行っています。それは二度登録されていません。それは、メッセージの一部がWrite()を呼び出し、もう片方がWriteLine()を呼び出したことです。これが起こるのは設計によるものと思われます。メッセージは複製されず、半分に分割されます。エンタープライズロギングブロックを使用していません。シンプルなトレースリスナとそれを呼び出す1行のデモプログラム。 – mfanto

0

私はUkadc Diagnostics

基本クラスからのTraceListenerの基本クラスを実装することによってこの問題を解決することができたが、次のとおりです。

public abstract class CustomTraceListener : TraceListener 
{ 
    private static readonly TraceSource Trace = new TraceSource("PostmarkTraceListener"); 

    /// <summary> 
    /// Construct an instance of the trace listener 
    /// </summary> 
    /// <param name="name">The name of the trace listener</param> 
    protected CustomTraceListener(string name) 
     : base(name) 
    { 

    } 

    #region Abstracts 

    /// <summary> 
    /// This method must be overriden and forms the core logging method called by all other TraceEvent methods. 
    /// </summary> 
    /// <param name="eventCache">A cache of data that defines the trace event</param> 
    /// <param name="source">The trace source</param> 
    /// <param name="eventType">The type of event</param> 
    /// <param name="id">The unique ID of the trace event</param> 
    /// <param name="message">A message to be output regarding the trace event</param> 
    protected abstract void TraceEventCore(TraceEventCache eventCache, string source, TraceEventType eventType, 
              int id, string message); 

    /// <summary> 
    /// This method must be overriden and forms the core logging method called by all otherTraceData methods. 
    /// </summary> 
    /// <param name="eventCache">A cache of data that defines the trace event</param> 
    /// <param name="source">The trace source</param> 
    /// <param name="eventType">The type of event</param> 
    /// <param name="id">The unique ID of the trace event</param> 
    /// <param name="data">The data to be logged</param> 
    protected abstract void TraceDataCore(TraceEventCache eventCache, string source, TraceEventType eventType, 
              int id, params object[] data); 

    #endregion 

    #region TraceData/TraceEvent Overrides 

    /// <summary> 
    /// Write a trace event 
    /// </summary> 
    /// <param name="eventCache">A cache of data that defines the trace event</param> 
    /// <param name="source">The trace source</param> 
    /// <param name="eventType">The type of event</param> 
    /// <param name="id">The unique ID of the trace event</param> 
    /// <param name="message">A message to be output regarding the trace event</param> 
    public override sealed void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, 
              int id, string message) 
    { 
     FilterTraceEventCore(eventCache, source, eventType, id, message); 
    } 

    /// <summary> 
    /// Write a trace event 
    /// </summary> 
    /// <param name="eventCache">A cache of data that defines the trace event</param> 
    /// <param name="source">The trace source</param> 
    /// <param name="eventType">The type of event</param> 
    /// <param name="id">The unique ID of the trace event</param> 
    /// <param name="format">A string format specification for the trace event</param> 
    /// <param name="args">Arguments used within the format specification string</param> 
    public override sealed void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, 
              int id, string format, params object[] args) 
    { 
     string message = string.Format(CultureInfo.CurrentCulture, format, args); 

     FilterTraceEventCore(eventCache, source, eventType, id, message); 
    } 

    /// <summary> 
    /// Write a trace event 
    /// </summary> 
    /// <param name="eventCache">A cache of data that defines the trace event</param> 
    /// <param name="source">The trace source</param> 
    /// <param name="eventType">The type of event</param> 
    /// <param name="id">The unique ID of the trace event</param> 
    public override sealed void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, 
              int id) 
    { 
     FilterTraceEventCore(eventCache, source, eventType, id, null); 
    } 

    /// <summary> 
    /// Write a trace event 
    /// </summary> 
    /// <param name="eventCache">A cache of data that defines the trace event</param> 
    /// <param name="source">The trace source</param> 
    /// <param name="eventType">The type of event</param> 
    /// <param name="id">The unique ID of the trace event</param> 
    /// <param name="data">The data to be written</param> 
    public override sealed void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, 
              int id, object data) 
    { 
     FilterTraceDataCore(eventCache, source, eventType, id, data); 
    } 

    /// <summary> 
    /// Write a trace event 
    /// </summary> 
    /// <param name="eventCache">A cache of data that defines the trace event</param> 
    /// <param name="source">The trace source</param> 
    /// <param name="eventType">The type of event</param> 
    /// <param name="id">The unique ID of the trace event</param> 
    /// <param name="data">The data to be written</param> 
    public override sealed void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, 
              int id, params object[] data) 
    { 
     FilterTraceDataCore(eventCache, source, eventType, id, data); 
    } 

    #endregion 

    #region Write Methods 

    /// <summary> 
    /// Write a message to the trace listeners 
    /// </summary> 
    /// <param name="message">The message to write</param> 
    public override void Write(string message) 
    { 
     FilterTraceEventCore(null, string.Empty, TraceEventType.Information, 0, message); 
    } 

    /// <summary> 
    /// Write a message to the trace listeners 
    /// </summary> 
    /// <param name="message">The message to write</param> 
    public override void WriteLine(string message) 
    { 
     Write(message); 
    } 

    #endregion 

    #region ShouldTrace 

    /// <summary> 
    /// Determines whether a filter is attached to this listener and, if so, asks whether it ShouldTrace applies to this data. 
    /// </summary> 
    protected virtual bool ShouldTrace(TraceEventCache eventCache, string source, TraceEventType eventType, int id, 
             string formatOrMessage, object[] args, object data1, object[] data) 
    { 
     return !(Filter != null && !Filter.ShouldTrace(eventCache, source, eventType, id, formatOrMessage, args, data1, data)); 
    } 

    #endregion 

    #region FilterTraceCore 

    /// <summary> 
    /// Called before the main TraceEventCore method and applies any filter by calling ShouldTrace. 
    /// </summary> 
    protected virtual void FilterTraceEventCore(TraceEventCache eventCache, string source, TraceEventType eventType, 
               int id, string message) 
    { 
     try 
     { 
      if (!ShouldTrace(eventCache, source, eventType, id, message, null, null, null)) 
       return; 

      TraceEventCore(eventCache, source, eventType, id, message); 
     } 
     catch (Exception exc) 
     { 
      Trace.TraceEvent(TraceEventType.Error, 0, "{0}", exc); 
     } 
    } 

    /// <summary> 
    /// Called before the main TraceDataCore method and applies any filter by calling ShouldTrace. 
    /// </summary> 
    protected virtual void FilterTraceDataCore(TraceEventCache eventCache, string source, TraceEventType eventType, 
               int id, params object[] data) 
    { 
     try 
     { 
      if (!ShouldTrace(eventCache, source, eventType, id, null, null, null, data)) 
       return; 

      TraceDataCore(eventCache, source, eventType, id, data); 
     } 
     catch (Exception exc) 
     { 
      Trace.TraceEvent(TraceEventType.Error, 0, "{0}", exc); 
     } 
    } 

    #endregion 
} 

と私のカスタムのTraceListener:

public class PostmarkTraceListener : CustomTraceListener 
{ 
    #region CustomTraceListener Overrides 

    /// <summary> 
    /// This method must be overriden and forms the core logging method called by all other TraceEvent methods. 
    /// </summary> 
    /// <param name="eventCache">A cache of data that defines the trace event</param> 
    /// <param name="source">The trace source</param> 
    /// <param name="eventType">The type of event</param> 
    /// <param name="id">The unique ID of the trace event</param> 
    /// <param name="message">A message to be output regarding the trace event</param> 
    protected override void TraceEventCore(TraceEventCache eventCache, string source, TraceEventType eventType, 
              int id, string message) 
    { 
     SendPostmarkMessage(eventCache, source, eventType, id, message, null); 
    } 

    /// <summary> 
    /// This method must be overriden and forms the core logging method called by all otherTraceData methods. 
    /// </summary> 
    /// <param name="eventCache">A cache of data that defines the trace event</param> 
    /// <param name="source">The trace source</param> 
    /// <param name="eventType">The type of event</param> 
    /// <param name="id">The unique ID of the trace event</param> 
    /// <param name="data">The data to be logged</param> 
    protected override void TraceDataCore(TraceEventCache eventCache, string source, TraceEventType eventType, 
              int id, params object[] data) 
    { 
     SendPostmarkMessage(eventCache, source, eventType, id, null, data); 
    } 

    #endregion 

    private void SendPostmarkMessage(TraceEventCache eventCache, string source, TraceEventType eventType, int id, params object[] data) 
    { 
     // do your work here 
    } 
} 

あなたは見つけることができます私の作業例github account

関連する問題