有没有扩展 System.Diagnostics.Trace 的好库?
我正在寻找的一些功能。
- 滚动原木
- smtp
而“使用 log4net”不是答案。原因是我不想引用任何第三方程序集。
回复评论:因为使用trace不会污染业务代码。我只调用 Trace.XXX。使用 Trace 的扩展可以在配置或启动时的少量代码中完成。如果我使用 log4net,则需要到处引用它。
有没有扩展 System.Diagnostics.Trace 的好库?
我正在寻找的一些功能。
而“使用 log4net”不是答案。原因是我不想引用任何第三方程序集。
回复评论:因为使用trace不会污染业务代码。我只调用 Trace.XXX。使用 Trace 的扩展可以在配置或启动时的少量代码中完成。如果我使用 log4net,则需要到处引用它。
它包含几个 TraceListener。更有趣的是,它增加了使用格式化语句的能力(比如 log4net 和 NLog 所支持的)。因此,您可以更好地控制日志文件的布局,包括记录哪些字段、字段的顺序、至少某些字段的格式(如数据/时间格式)。您甚至可以编写自己的“令牌”,然后在格式化语句中引用它们。它不支持几乎与 log4net 或 NLog 一样多的格式化选项,也不支持几乎数量的 TraceListener,但是,对于基于 System.Diagnostics 的解决方案,它是“开箱即用”功能的真正进步在 System.Diagnostics 中可用。
这不算一个库,但我写了一次文本框监听器,这样我就可以将文本框放在表单上,并自动获取跟踪输出......
public class TraceLogTextBox : RichTextBox
{
private TraceListener listener;
public TraceLogTextBox()
: base()
{
listener = new TextBoxTraceListener(this);
Trace.Listeners.Add(listener);
}
protected override void Dispose(bool disposing)
{
Trace.Listeners.Remove(listener);
base.Dispose(disposing);
}
}
public class TextBoxTraceListener : TraceListener
{
private RichTextBox txtBox;
const string ERROR = "error";
public TextBoxTraceListener(RichTextBox tbox)
: base()
{
txtBox = tbox;
}
public override void Write(object o)
{
if (o is Exception)
{
Write(o.ToString(), ERROR);
}
else
{
Write(o.ToString());
}
}
public override void Write(string message)
{
Write(message, string.Empty);
}
public override void Write(string message, string category)
{
Color col = category.ToLower() == ERROR ? Color.Red : Color.Black;
txtBox.SelectionColor = col;
if (category == string.Empty)
{
txtBox.SelectedText = message;
}
else
{
txtBox.SelectedText = string.Format("[{0}] {1}", category, message);
}
}
public override void WriteLine(string message)
{
WriteLine(message, string.Empty);
}
public override void WriteLine(object o)
{
if (o is Exception)
{
WriteLine(o.ToString(), ERROR);
}
else
{
WriteLine(o.ToString());
}
}
public override void WriteLine(string message, string category)
{
Color col = category.ToLower() == ERROR ? Color.Red : Color.Black;
txtBox.SelectionColor = col;
if (category == string.Empty)
{
txtBox.SelectedText = string.Format("{0}\n",message);
}
else
{
txtBox.SelectedText = string.Format("[{0}] {1}\n", category, message);
}
}
}
企业库日志记录应用程序块“扩展”了 System.Diagnostics.TraceSource 等类。
我理解您为什么不想依赖第三方 API 来污染您的业务代码。
然而,System.Diagnostics.Trace 的 API 不如其他日志框架(如 EntLib 和 Log4Net)提供的 API 灵活,这也是一个事实。
我所做的是开发了一个受 log4net 强烈影响的内部 API,它使用提供者模型设计模式在任何合适的日志记录框架上提供一个瘦包装器。我有 System.Diagnostics.Trace、log4net 和 EntLib 的提供程序。基本概念与 .NET日志库的通用基础结构非常相似。
这样你的业务代码就只依赖于你自己的内部 API,并且可以在运行时使用配置来选择日志框架。
当然,您可以通过坚持 System.Diagnostics.Trace 并为 SMTP 编写您自己的 TraceListeners(参见此 CodeProject 示例)或滚动日志来实现您想要的。或者编写您自己的 TraceListener 重定向到 Log4Net 等日志记录框架,然后您可以访问该框架支持的记录器。