すべてのログメッセージを任意のWCFエンドポイントに送信するエンタープライズライブラリロギングのカスタムトレースリスナーを作成しようとしています。この背後にあるアイデアは、リアルタイムですべてのログメッセージを出力する、単純なコンソールアプリケーションなどを相手側に設定できるということです。エンタープライズライブラリロギング:任意のWCFエンドポイントにメッセージを送信するカスタムトレースリスナ
私の質問は二つの部分である:既にこれを行うためのメカニズムが
- ありますか?私はすでにMSMQリスナーを見ていました。私は、ある時点で別のプロトコル/バインディングを使用する必要があるかもしれないので、MSMQリスナーを見ました。
- 私はそれを以下のように実装しています - それは十分に効率的か、それとも良い方法がありますか?私の懸念は、メッセージがロガーから来るたびに(頻繁になるかもしれない)、私は新しいチャンネルを開いて、それを閉じ込めることです。これがパフォーマンスの問題を引き起こしますか?
私のサンプルでは、RemoteClient
は、ClientBase<T>
に由来します。
[ConfigurationElementType(typeof(CustomTraceListenerData))]
public class RemoteTraceListener : CustomTraceListener
{
public override void Write(string message)
{
RemoteClient client = new RemoteClient();
client.Open();
client.Write(message);
client.Close();
}
public override void WriteLine(string message)
{
RemoteClient client = new RemoteClient();
client.Open();
client.WriteLine(message);
client.Close();
}
public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data)
{
if (data is LogEntry && this.Formatter != null)
{
WriteLine(this.Formatter.Format(data as LogEntry));
}
else
{
WriteLine(data.ToString());
}
}
}
私はあなたが「プールする」という意味では明確ではありません。私が使用できるIISにキャッシュ機構がありますか、それを何らかのシングルトンとして実装することを意味していますか?また、ストリーミングではどういう意味ですか?セッション中のTCPバインディングのような意味ですか?それはチャンネルを開いたままにしておくことを意味します。パフォーマンス、システムの安定性などにどのような影響があるのかを知りたいのですが、今はnetMSMQバインディングを使用していますのでセッションを続けるとオプションがないようです。 –
私は、 'ClientBase'は既にThilakが 'プールする'ことを意味するものと考えています。これは実質的にChannelFactoryをキャッシュしていますので、 'new Client'を呼び出すと、既存のフォールトでないクライアント(シーンキャッシュの裏側) –