[編集]
カスタムトレースリスナーのコンテキストでこれについて言及している質問のタイトルの部分を見逃しました。したがって、Trace.WriteLineとDebug.WriteLineを区別できるカスタムTraceListenerを作成した(または作成したい)ようです。Trace.WriteLineやDebug.WriteLineよりもTraceSourcesの方が望ましい限り、以下で言うことはすべて当てはまると思います。ただし、TraceListenerのWriteメソッドとWriteLineメソッド内から、Trace.WriteLineとDebugの呼び出しが原因で最終的に呼び出されたかどうかを判断することはできないと思うことを除いて、私の答えは必ずしもあなたの質問に答えるものではありません。 .WriteLine。
カスタムTraceListener内から、WriteまたはWriteLineの最終的な呼び出し元を特定できたとしても、何を達成しようとしているのかは明確ではありません。達成したいことが何であれ、最初にTraceSourcesに基づいてコードのロギングステートメントを作成した方が簡単だと私は信じなければなりません。
Trace.WriteLineとDebug.WriteLineへの呼び出しを追加して、アプリケーションコードを作成する方法を示すコードを元の質問に追加してください。また、Trace.WriteLineとDebug.WriteLineを区別できる場合に実行するアクションを示す、カスタムTraceListenerのコードをいくつか示します。何かのようなもの:
public void WriteLine(string msg)
{
if (WasWrittenFromTrace)
{
//Before writing to output, add "TRACE" to front of message
WriteToOutput("TRACE: {0}", msg);
}
else
if (WasWrittenFromDebug)
{
//Before writing to output, add "DEBUG" to front of message
WriteToOutput("DEBUG: {0}", msg);
}
}
[編集終了]
System.Diagnosticsの使用に関する質問に答えて、最近投稿したこの回答を参照してください。
そこには多くの情報があり、その回答内のリンクには、Trace.WriteLineやDebug.WriteLineではなくTraceSourcesの使用に重点を置いたSystem.Diagnosticsの使用方法に関する多くの情報があります。
あなたの質問から、あなたはこのようなコードを書きたいと思うかもしれないように思えます:
public void MyFunction(int x, int y)
{
Trace.WriteLine("Entering MyFunction. x = {0}, y = {1}", x, y);
int product = x * y;
Debug.WriteLine("product = {0}", product);
Trace.WriteLine("Exiting MyFunction");
}
また、Trace出力を1つのTraceListenerに移動し、Debug出力を別のTraceListenerに移動するようにします。または、TraceListener内(おそらく自分で作成する)で、特定のWrite/WriteLineが実際にTrace.WriteであるかDebug.Writeであるかを判別できるようにします。それは本当に可能ではないと思います。
また、他の方法でトレースとデバッグの出力を制御しますか(おそらく、1つをオンにしてもう1つをオフにしますか?
TraceSourcesを使用する場合は、トレース/ロギングのレベルを簡単に制御できます。また、必要に応じて、一部のTraceSourceの出力を1つのTraceListenerに送信し、他の出力を別のTraceListener(および一部のTraceListener)に送信できます。 TraceSourcesは複数のTraceListenersに書き込むこともできます)。
したがって、TraceSourcesを使用して、次のようなコードを記述できます。
public class MyClass
{
//Static variable, so all instances of MyClass will have access to the same instance
//of the TraceSource
private static readonly TraceSource ts = new TraceSource("MyClass");
public void MyMethod(int x, int y)
{
ts.TraceEvent(TraceEventType.Information, 0, "Entering MyMethod. x = {0}, y = {1}", x, y);
int product = x * y;
ts.TraceEvent(TraceEventType.Debug, 0, "Product = {0}", product);
ts.TraceEvent(TraceEventType.Information, 0, "Exiting MyMethod.");
}
}
この例でのTraceSourceの利点は何ですか?
app.configで、「MyClass」TraceSourceをオンまたはオフにするか、特定のレベルに設定できます。「デバッグ」に設定すると、デバッグと情報のメッセージが書き込まれます。「情報」に設定すると、情報メッセージのみがログに記録されます。「情報」より高く設定すると、例のメッセージはログに記録されません。
app.configで、「MyClass」の出力を1つ以上のTraceListenersに送信できます。より多くのTraceSource( "YourClass"、 "HisClass")がある場合、それぞれが同じTraceListenerに移動するか、それぞれが独自のTraceListenerに移動するか、またはそれらの間の任意の組み合わせになります。
app.configで、「MyClass」がたとえば2つのTraceListenerに移動するように指定されるように、スイッチングやフィルタリングを設定できます。1つのTraceListenerは、「デバッグ」メッセージのみがログに記録されるようにフィルタリングでき、もう1つは、「情報」メッセージのみがログに記録されるようにフィルタリングできます。
TraceSourcesでできることはもっとたくさんあります。上記のリンクとその投稿内のリンクをお読みください。投稿で参照しているUkadc.Diagnosticsプロジェクトを参照してください。 Essential.Diagnosticsは、System.Diagnosticsの拡張機能を提供するだけでなく、System.Diagnosticsの使用例を示す別のプロジェクトです。 これは、TraceSources、フィルター、およびTraceListenersの使用に関するMSDNの良い例です。
私の意見では、Trace。*やDebug。*ではなくTraceSourcesを使用して、コードにトレース/ログを追加しようとすると、より良い結果が得られます。
幸運を!