21

ロギングに関する他の多くの質問を見てきました。ベストプラクティス。どのロギング プラットフォームが最適か。など。トピックに関する非常に良い議論があるSOのここからのリンクがいくつかあります。

ロギングのベスト プラクティス

log4net と TraceSource

.NET 3.5 プロジェクトに最適なログ ソリューション

.NET 3.5 ロギング

編集を開始:

この長い投稿を入力して、私が理解しようとしている主なことは、WCF のログ記録/トレースとアクティビティ ID の伝達が System.Diagnostics と TraceSources にどれほど緊密に結合されているかということだと思います。log4net や NLog などのサード パーティのログ プラットフォームを使用して、「適切な」WCF ログ/トレースとアクティビティ ID の伝達を取得できますか。これを行う場合、どのようにしますか?

ServiceTraceViewer に関するいくつかの質問については、この投稿の下部を参照してください。

編集を終了します。

私の質問の主題は、これらの投稿のいずれにおいても詳細に議論されていません. ロギングと WCF に関して人々が何をしているかに興味があります。WCF サービスを含むプロジェクトに取り組んでおり、プロジェクトにログインしている場合、WCF 固有のログ機能を使用するために特別な努力をしていますか? 特に、アクティビティ トレース、アクティビティ伝播、エンド ツー エンド トレースなどを取り入れようとしていますか? MSDN のこの記事 で概説されているようなものです。これは、アクティビティの伝達に関するMSDNの別の記事です。

この記事では、System.Diagnostics の TraceSource を使用して、アクティビティのトレース、アクティビティの伝播、およびエンド ツー エンドのトレースを行う方法について説明しています。app.config/web.config ファイルを介してこれらのオプションを「オン」にするように WCF を構成する方法を示します。WCF は内部で TraceSources を使用して、通信の結果をログに記録します。

System.Diagnostics と TraceSources を介してアクティビティの伝播を実現する方法を多かれ少なかれ示すサンプル コード (上記でリンクされた 2 番目の MSDN 記事から) を次に示します。

TraceSource ts = new TraceSource("myUserTraceSource");
Guid oldID = Trace.CorrelationManager.ActivityId;
Guid traceID = Guid.NewGuid();
ts.TraceTransfer(0, "transfer", traceID);
Trace.CorrelationManager.ActivityId = traceID; // Trace is static
ts.TraceEvent(TraceEventType.Start, 0, "Add request");

double value1 = 100.00D;
double value2 = 15.99D;
ts.TraceInformation("Client sends message to Add " + value1 + ", " + value2);
double result = client.Add(value1, value2);
ts.TraceInformation("Client receives Add response '" + result + "'");

ts.TraceTransfer(0, "transfer", oldID);
ts.TraceEvent(TraceEventType.Stop, 0, "Add request");
Trace.CorrelationManager.ActivityId = oldID;

WCF がアクティビティを伝達したかどうかを、サービス内から確認できる方法を次に示します。

// Check if an activity was set in scope by WCF, i.e., if it was 
// propagated from the client. If not, i.e., ambient activity is 
// equal to Guid.Empty, create a new one.
if(Trace.CorrelationManager.ActivityId == Guid.Empty)
{
    Guid newGuid = Guid.NewGuid();
    Trace.CorrelationManager.ActivityId = newGuid;
}
// Emit your Start trace.
ts.TraceEvent(TraceEventType.Start, 0, "Add Activity");

// Emit the processing traces for that request.
serviceTs.TraceInformation("Service receives Add " 
                        + n1 + ", " + n2);
// double result = n1 + n2;
serviceTs.TraceInformation("Service sends Add result" + result);

// Emit the Stop trace and exit the method scope.
ts.TraceEvent(TraceEventType.Stop, 0, "Add Activity");
// return result;

私が見たすべての例から、アクティビティの伝播は System.Service モデルの TraceSource を構成し (通常は app.config を介して)、その propagActivity プロパティを "true" に設定することで達成されます。アクティビティは、Trace.CorrelationManager.ActivityId にアクティビティ ID (guid) を設定することによって実際に伝達されます。log4net または NLog を使用している場合、WCF のログ記録とアクティビティの伝達を効果的に使用できますか?

私のプロジェクトでは、WCF を非常に頻繁に使用します。現在、ロギング ソリューションに落ち着こうとしています。System.Diagnostics および TraceSources で WCF のログ記録とアクティビティの伝達がどのように機能するかについては、かなりよく理解できていると思います。log4net や NLog などのロギング プラットフォームを使用して、同様のことがどのように達成できるかをよりよく理解したいと思います。

彼らは「ネイティブ」サポートを提供していますか?アクティビティの伝播を「手動で」達成できるように、何らかのインフラストラクチャを提供する可能性が少し高いようです。多分このようなもの:

//Inside client code:
ILog logger = LogManager.GetLogger("client");
Guid oldActivity = Trace.CorrelationManager.ActivityId;
if (oldActivity == Guid.Empty)
{
  Trace.CorrelationManager.ActivityId = Guid.NewGuid();
}

using (LogManager.NDC.Push(Trace.CorrelationManager.ActivityId))
{
  log.Info("Before calling WCF Service");

  wcfService.Method();

  log.Info("After calling WCF Service");
}
Trace.CorrelationManager.ActivityId = oldActivity;

log4net/NLog ログ形式が NDC スタックの一番上をログに記録するように構成されている場合、(アクティビティがスコープ内にある間) クライアントによってログに記録された各メッセージは、アクティビティ ID で「タグ付け」されます。WCF サービスが同様に実装されていると仮定すると、サービス呼び出し中にログに記録されたすべてのメッセージも (おそらく別のファイルに) ログに記録され、同じアクティビティ ID でタグ付けされます。そのため、「サービス」ログ ファイル内のログ メッセージを「クライアント」ログ内の対応するメッセージに関連付けることができます。

したがって、WCF を使用していて、ログを記録している場合は、次の質問があります。

  1. アクティビティの伝播を使用していますか?
  2. ロギングに TraceSources を使用していますか?
  3. 他のログ プラットフォーム (log4net、NLog など) を使用していますか?
  4. 別のロギング プラットフォームを使用している場合、アクティビティの伝播はどのように行うのですか?
  5. サードパーティのログ (log4net/NLog - ほとんどのログ) とSystem.Diagnostics.TraceSource(WCF サービス境界のログ) を組み合わせて使用​​していますか?

ServiceTraceViewer はどうですか? 使いますか?私が見たほとんどの例は、TraceSources と XmlTraceListener を介して System.Diagnostics によって生成された出力を示しています。log4net、NLog などからの出力を使用できますか? TraceSource ベースのロギングで「最適」に機能しますか? もしそうなら、ServiceTraceViewer で表示するために、WCF サービス境界での TraceSource ベースのロギング (一部のアプリ コンテキストと WCF 通信情報をキャプチャする) を少しだけ持つだけで「十分」でしょうか? 進行中の WCF 学習プロセスの一環として、ServiceTraceViewer を簡単に使用しました。

ここまで読んでくれてありがとう。ログの統合、WCF アクティビティの伝播、および ServiceTraceViewer でログを表示する機能について考えすぎているのかもしれません。ロギング プラットフォームやロギング戦略の選択において重要な考慮事項のように思えますが、これらのロギング プラットフォームや WCF について確実に知るには十分な経験がありません。

4

2 に答える 2

3

私のニッケルの価値だけで、私は自分で書いたり維持したりするAOPベースのログを使用しますが、それは他のログフレームワークのいくつかのようなものです...私のものはデコレーターに基づいていますが、コールスタックに入るあらゆるものに拡張できます。

したがって、次のようなものがあります。

using (LogManager.NDC.Push(Trace.CorrelationManager.ActivityId)) {
  log.Info("Before calling WCF Service");

  wcfService.Method();

  log.Info("After calling WCF Service");
}
Trace.CorrelationManager.ActivityId = oldActivity;

サーバーにこのようなものがあった場合、私の方法はその点で機能しますが、私の方法は内部ログに対してはこのようには機能しません。私はこれを行うように設定されています:

[LogMethod( CaptureDirection = LoggingDirection.InOut /*Optional*/, CaptureVariables = Yes /*Optional*/ )]
public ClassName MyMethodName(params){
  //magic logging happens here on method entry

  DoSomething();

  //if you need logging here I can't do anything with my AOP system

  DoSomethingElse();


  //magic logging happens here on method exit
}

さらに、クライアントとサーバー間の相関ロギングを検討していますか? この2つをどのように交渉しますか?一方が他方に関連していることをどのように確認できますか?

于 2010-12-03T05:30:58.610 に答える
0

CodeProjectの記事では 、カスタム レンダラーとリスナーを作成して NLog を使用してアクティビティをトレースし、何をログに記録するかを構成で指定する方法について説明しています。

Nlog 拡張機能のソース コードは、http://lowleveldesign.codeplex.com/releases/view/96938 にあります

免責事項:私は解決策を試していません。使用することを計画しているだけです。

于 2013-06-25T12:18:25.913 に答える