添加跟踪方法System.Diagnostics.TraceListener

问题描述:

我写了从System.Diagnostics.TraceListener衍生像这样添加跟踪方法System.Diagnostics.TraceListener

public class Log : TraceListener 

这作为包装日志类log4net的,并允许人们使用System.Diagnostics程序像追踪所以

Trace.Listeners.Clear(); 
Trace.Listeners.Add(new Log("MyProgram")); 
Trace.TraceInformation("Program Starting"); 

有添加额外的跟踪级别,则默认跟踪那些(错误,警告,信息)

我想有这个加入到运营商的请求ystem.Diagnostics.Trace所以它可以使用像

Trace.TraceVerbose("blah blah"); 
Trace.TraceAlert("Alert!"); 

有没有什么办法可以做到这一点与扩展类?我试图

public static class TraceListenerExtensions 
{ 
    public static void TraceVerbose(this Trace trace) {} 
} 

,但什么都没有的跟踪实例暴露:(传递

这是为时已晚,但你有没有考虑过使用TraceSource? TraceSources为您提供实际的对象实例,您可以使用它们登录System.Diagnostics(这意味着您可以使用扩展方法扩展它们,就像您在问题中提出的那样)。 TraceSources通常在app.config中配置(类似于您将如何配置log4net记录器)。您可以控制日志记录的级别以及哪些跟踪侦听器正在侦听。所以,你可以有应用程序代码,编程对TraceSource,这可能看起来是这样的:

public class MyClassThatNeedsLogging 
{ 
    private static TraceSource ts = 
      new TraceSource(MethodBase.GetCurrentMethod().DeclaringType.Name); 
    //Or, to get full name (including namespace) 
    private static TraceSource ts2 = 
      new TraceSource(MethodBase.GetCurrentMethod().DeclaringType.FullName); 

    private count; 

    public MyClassThatNeedsLogging(int count) 
    { 
    this.count = count; 

    ts.TraceEvent(TraceEventType.Information, 0, "Inside ctor. count = {0}", count); 
    } 

    public int DoSomething() 
    { 
    if (this.count < 0) 
    { 
     ts.TraceEvent(TraceEventType.Verbose, 0, "Inside DoSomething. count < 0"); 
     count = Math.Abs(count); 
    } 

    for (int i = 0; i < count; i++) 
    { 
     ts.TraceEvent(TraceEventType.Verbose, 0, "looping. i = {0}", i); 
    } 
    } 
} 

您还可以创建使用任何名称TraceSources(即它不必是类名):

TraceSource ts1 = new TraceSource("InputProcessing"); 
TraceSource ts2 = new TraceSource("Calculations"); 
TraceSource ts3 = new TraceSource("OutputProcessing"); 

正如我前面提到的,每个TraceSource通常配置在app.config文件中,以及日志“级别”和应该接收输出的侦听器。

为了您的扩展方法,你可以做这样的事情:

public static class TraceSourceExtensions 
{ 
    public static void TraceVerbose(this TraceSource ts, string message) 
    { 
    ts.TraceEvent(TraceEventType.Verbose, 0, message); 
    } 
} 

如果你需要做的TraceSource的更多个性化(如添加额外的水平),这是描述如何做一个相当不错的文章即:

http://msdn.microsoft.com/en-us/magazine/cc300790.aspx

如果最终使用的log4net您的TraceListener内(并用它来定义一个名为记录器,日志记录级别等),你可能并不需要配置许多TraceSources。您甚至可以只配置一个(其名称将是众所周知的),或者您可以以编程方式创建一个,将其设置为记录“全部”,然后将其连接到特定的TraceListener。

最后,您可以不通过静态Trace对象进行日志记录,而是可以通过TraceSource实例登录。如果配置了一个TraceSource和它的名字是众所周知的,有效的TraceSource可以创建(用于日志记录)的任何地方像这样:

TraceSource ts = new TraceSource("logger"); 
ts.TraceEvent(TraceEventType.Information, 0, "Hello World!"); 
//Or, via your extension method 
ts.TraceVerbose(TraceEventType.Verbose, 0, "Logged via extension method"); 

可能有更好的方法来完成你正在试图完成的任务,但是这可能会给你一些关于使用TraceSource与静态Trace类的思考。

你的问题是,你不能添加扩展方法作用于静态类。扩展方法的第一个参数。它应该在操作实例由于Trace类是静态的,不存在这样的情况下你可能最好创建自己的静态日志的包装,露出你想拥有的方法,如TraceVerbose

public static class LogWrapper 
{ 
    public static void TraceVerbose(string traceMessage) 
    { 
     Trace.WriteLine("VERBOSE: " + traceMessage); 
    } 
    // ...and so on... 
} 

这也将解耦你从实际的日志记录框架中使用日志代码,这样你可以稍后从跟踪日志切换到使用log4net或其他东西,如果你想。

+1

然后问题是每个人都必须使用我的记录器。通过在日志框架内工作,人们可以使用它。例如System.Diagnostics.Trace.TraceWarning(“warning!”)。此外,使用System.Diagnostics.Trace的任何第三方程序集都会自动将消息发送到我们的记录器,而无需修改。 – Kenoyer130 2010-03-19 18:16:54