您可能想查看 .NET Tracing。我更喜欢只使用内置的 TraceSource 类而不是使用像 nlog 这样的第 3 方日志记录框架。我曾经走在甚至围绕 nlog 写一个外观的道路上,但是有这么多依赖和这么多抽象层,只是为了写一条日志消息似乎很愚蠢。
您可以在此处查看 TraceSource 的概述:http://msdn.microsoft.com/en-us/library/system.diagnostics.tracesource.aspx
我们的想法是将追踪与聆听分开。在整个代码中,您可以添加跟踪调用,每个调用都有不同的日志级别(错误、详细、调试)和不同的来源。然后在您的应用程序配置中配置不同的侦听器。
<system.diagnostics>
<sources>
<source name="Source1" switchName="verboseSwitch">
<listeners>
<add name="console" />
</listeners>
</source>
<source name="Source2" switchName="warningSwitch">
<listeners>
<add name="console" />
</listeners>
</source>
</sources>
<switches>
<add name="verboseSwitch" value="Verbose" />
<add name="warningSwitch" value="Information" />
</switches>
<sharedListeners>
<add name="console" type="System.Diagnostics.ConsoleTraceListener" initializeData="false"/>
</sharedListeners>
<trace autoflush="true" indentsize="4">
<listeners>
<add name="console" />
</listeners>
</trace>
</system.diagnostics>
public void MethodOne()
{
TraceSource ts = new TraceSource("Source1");
ts.TraceEvent(TraceEventType.Verbose, 0, "Called MethodOne");
// do something that causes an error
ts.TraceEvent(TraceEventType.Error, 0, "MethodOne threw an error");
}
在这里,MethodOne 设置为使用源“Source1”。 Source1 当前在上面配置为收听 Verbose 和更高级别的任何内容。所以这意味着
Called MethodOne
MethodOne threw an error
都将写入控制台
public void MethodTwo()
{
TraceSource ts = new TraceSource("Source2");
ts.TraceEvent(TraceEventType.Verbose, 0, "Called MethodTwo");
// do something that causes a error
ts.TraceEvent(TraceEventType.Error, 0, "MethodTwo threw an error");
}
不过,在这里,MethodTwo 被配置为使用 Source2,它只设置为侦听警告及以上。
所以,当代码运行时,输出将是
MethodTwo threw an error
这使您可以控制程序不同部分的信息量。也许如果有一天您开始在某个库中看到错误,您可以将该库的跟踪源设置为详细信息,现在可以查看所有调试信息,而不会被来自程序其他部分的数据所淹没。
我像这样使用不同的侦听器来控制严重错误的流程。我有某些来源和某些错误级别的侦听器,当错误写入日志时,它们会向我发送电子邮件。我不关心 404 错误,但我确实关心注册码中发生的任何事情,例如。
您有 ConsoleTraceListener 用于写入控制台/调试窗口
FileLogTraceListener 用于写入文件
甚至EventLogTraceListener
你可以看到内置监听器的完整列表here
还有第三方监听器,用于发送有关日志事件的电子邮件、存储在数据库中、写入 Azure 表存储等。
您当然可以使用 NLog 之类的框架来完成所有这些工作。 .NET Trace 方法具有高性能,并且在整个 .NET Framework 中都有使用。恕我直言,选择它不会出错。