Trace.Listeners和Debug.Listeners共享同一个内部集合,因此,我无法将Trace监听器添加到Trace.Listeners中,而将debug监听器添加到Debug.Listeners中以区分它们。
我怎样才能做到这一点?
编辑:
为什么要执行此操作,仅是因为我将日志记录层写入了我们的应用程序,并且希望跟踪整个系统中的不同日志,因此Debug/Trace是两个日志源(也有几个其他源) )我想跟踪。
最佳答案
[编辑]
我错过了问题标题中的部分,您在自定义跟踪监听器的上下文中提到了这一点。因此,显然您已经编写了(或想要编写)自定义的TraceListener,可以在Trace.WriteLine和Debug.WriteLine之间进行区分。我认为,只要TraceSources比Trace.WriteLine和Debug.WriteLine更可取,我下面所说的所有内容仍然适用。但是,我的答案并不一定回答您的问题,只是说我认为不可能从TraceListener的Write和WriteLine方法中判断它们是否由于调用Trace.WriteLine与Debug而最终被调用了。 .WriteLine。
即使您可以从自定义TraceListener内得知对Write或WriteLine的最终调用来源,也不清楚要完成什么。无论您要完成什么工作,我都必须相信,如果您首先将代码中的日志记录语句基于TraceSources进行,则操作会更容易。
您能否在原始问题中添加一些代码,以显示如何编写一些应用程序代码,并向Trace.WriteLine和Debug.WriteLine添加一些调用。另外,显示来自您的自定义TraceListener的一些代码,这些代码显示如果您可以区分Trace.WriteLine和Debug.WriteLine,则想要执行的操作。就像是:
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);
}
}
[END EDIT]
请参阅我最近发布的this answer,以回应有关使用System.Diagnostics的问题。
关于如何使用System.Diagnostics,答案中有很多信息,并且链接中有很多信息,重点是使用TraceSources而不是Trace.WriteLine和Debug.WriteLine。
从您的问题看来,您可能想编写一些如下代码:
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输出转到一个TraceListener,将Debug输出转到另一个TraceListener。或在TraceListener中(也许您会自己写),您希望能够知道给定的Write/WriteLine实际上是Trace.Write还是Debug.Write。我认为那是不可能的。
您是否还想以其他方式控制“跟踪和调试”输出(也许打开和关闭一个?
如果使用TraceSources,则可以轻松地控制跟踪/日志记录的级别,并且如果愿意,可以将某些TraceSource的输出发送到一个TraceListener,而将其他TraceSource的输出发送到另一个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有什么好处?
TraceSources可以做很多事情。阅读上面的链接以及该帖子中的链接。请参阅我在文章中引用的Ukadc.Diagnostics项目。 Essential.Diagnostics是另一个提供System.Diagnostics扩展的项目,并显示了一些使用System.Diagnostics的很好的示例。 Here is a good example from MSDN about using TraceSources, filters, and TraceListeners。
我认为,如果您尝试使用TraceSources而不是Trace。*和Debug。*向代码中添加跟踪/日志记录,将会更好。
祝你好运!
关于.net - 如何在自定义跟踪监听器中区分跟踪和调试调用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4692240/