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