分離ストレージにログを記録し、HttpWebRequest を使用した単純な PUT/POST を使用して、または気まぐれな場合は WCF サービスを使用して、ユーザーがログをサーバーに送信する方法を提供します。
XBAP は 512k の分離ストレージしか取得できないため、実際にはこれらのイベント ログをサーバーに自動的にプッシュする必要があることに注意してください。また、XBAP は元のサーバーにのみ応答できるため、ログ ファイルを受け入れるサービスは同じドメインで実行する必要があることに注意してください。
TextWriterTraceListener
これは、 の上にをセットアップする方法を示す簡単なサンプル コードですIsolatedStorageFileStream
。この時点で、標準のTrace.Write[XXX]
方法を使用してロギングを行うことができます。
IsolatedStorageFileStream traceFileStream = new IsolatedStorageFileStream("Trace.log", FileMode.OpenOrCreate, FileAccess.Write);
TraceListener traceListener = new TextWriterTraceListener(traceFileStream);
Trace.Listeners.Add(traceListener);
アップデート
これは、質問に詳細を加えて修正したため、修正された回答です。
デスクトップ アプリで log4net を使用しているとのことなので、XBAP バージョンでも log4net を引き続き使用することは完全に可能であるため、既に快適に作業している依存関係に基づいて構築できます。IAppender
Log4net には、この問題をすぐに解決できる実装は付属していませんが、WCF と通信する log4net の実装を作成することは可能です。
Joachim Kerschbaumer によってリンクされた他の回答者の実装を調べました (すべてクレジットが必要です)。私の最初の懸念は、サンプルでは、誰かがすべてのイベントでおそらく同期的にサービスにログインしている可能性があるということでしたが、実装では実際には一定数のイベントをキューに入れ、それらをバッチ形式でサーバーに送り返すことがサポートされています。また、サービスに送信する場合は、アクション デリゲートの非同期呼び出しを使用して送信します。つまり、スレッド プール スレッドで実行され、UI をブロックしません。したがって、実装は非常に堅実であると言えます。
ここから私がとるステップは次のとおりです。
- Joachim の WCF アペンダー実装をダウンロードする
- 彼のプロジェクトをソリューションに追加します。
- XBAP から WCFAppender プロジェクトを参照する
- WCF アペンダーを使用するように log4net を構成します。現在、このロガーにはいくつかの設定があるため、彼のサンプル アプリの構成を確認することをお勧めします。ただし、最も重要なのは QueueSize と FlushLevel です。QueueSize を十分に高く設定して、実際にログに記録している量に基づいて、WCF サービスとやり取りしすぎないようにする必要があります。警告/エラーのみを構成している場合は、おそらくこれを低い値に設定できます。情報を使用して構成している場合は、これを少し高く設定する必要があります。FlushLevel に関しては、おそらくこれを ERROR に設定する必要があります。これにより、エラーが発生した時点でキューがどれほど大きくても、エラーがログに記録された時点ですべてがフラッシュされることが保証されます。
- このサンプルは、LINQ2SQL を使用して WCF サービス内のカスタム DB にログを記録しているようです。ニーズに最適なデータ ソースにログを記録するには、この実装を置き換える必要があります。
現在、Joachim のサンプルは、だれかが非常に簡単にダウンロードして実行し、すぐに理解できるように書かれています。実稼働ソリューションに入れる場合は、間違いなくいくつかの点を変更します。
- WCF コントラクトを、クライアントとサーバー間で共有できる別のライブラリに分割します。これにより、WCFAppender ライブラリで Visual Studio サービス参照の使用を停止し、データ型に対して同じコントラクト ライブラリを参照するだけで済みます。同様に、コントラクトはサービス自体に存在しなくなるため、サービスからコントラクト ライブラリを参照します。
- ここで wsHttpBinding が本当に必要かどうかはわかりません。これほどシンプルなものにおそらく必要な数よりも多くのノブとスイッチが付属しています。おそらく、より単純な basicHttpBinding を使用します。ログ データがネットワーク経由で暗号化されていることを確認したい場合は、HTTPS を使用するようにします。