4

从 C# 和 .NET 2.2 上的控制台程序记录到日志 (.txt) 的最有效方法是什么?我的程序循环多次,总是根据用户的需要输出不同的数据,所以我正在寻找实现这一目标的最有效方法。

我知道我总是可以重新打开一个流然后关闭它,但是每次我这样做时它只会写一行,然后下一次(几秒钟后)程序重新循环并需要再次写入。在我看来,这似乎对资源不太友好。

我正在使用多个线程,这些线程都有我想要记录的输出数据(打开/关闭同一个文件或在不同线程上访问同一个文件可能很糟糕)。“持有对自动刷新的流编写器的引用”听起来是个好主意,但我不知道该怎么做。

4

6 回答 6

16

考虑使用log4net

一个帮助程序员将日志语句输出到各种输出目标的工具...我们在利用 .NET 运行时中的新功能的同时,使框架在精神上与原始 log4j 相似。有关 log4net 的更多信息,请参阅功能文档...

于 2008-09-30T15:39:06.477 回答
3

我接受每次写一行时打开和关闭所带来的性能损失。这是一个可靠性决定。如果您将所有内容都保存在内存中并且发生了严重崩溃,那么您根本没有日志信息来帮助进行故障排除。如果这不是您关心的问题,那么将其保存在内存中肯定会提供更好的性能。

于 2008-09-30T15:42:36.093 回答
3

您可以连接到构成 CLR 一部分的跟踪框架。使用一个简单的类,如:http ://www.chaosink.co.uk/files/tracing.zip ,您可以有选择地记录诊断信息。要使用它,请将类添加到您的应用程序中。在您的类中创建跟踪器的实例,例如:

private Tracing trace = new Tracing("My.Namespace.Class");

并使用以下方法调用它:

MyClass()
{
    trace.Verbose("Entered MyClass");
    int x = 12;
    trace.Information("X is: {0}", x);
    trace.Verbose("Leaving MyClass");
}

内置跟踪框架中有 4 个级别的信息:

详细 - 记录程序流

信息 - 记录监视器感兴趣的特定信息

警告 - 记录无效状态或可恢复异常

错误 - 记录不可恢复的异常或状态

要从您的应用程序访问信息,请在 app.config(或 web.config)中添加以下内容:

<system.diagnostics>
    <trace autoflush="false" indentsize="4">
        <listeners>
            <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="c:\mylogfile.log" />
        </listeners>
    </trace>
    <switches>
        <add name="My.Namespace.Class" value="4"/>      
    </switches>
</system.diagnostics>

您还可以附加侦听器以将其发布到事件日志或您感兴趣的任何其他位置。有关跟踪框架的更多信息,请访问:

http://msdn.microsoft.com/en-us/library/ms733025.aspx

于 2008-09-30T15:52:14.433 回答
2

我同意使用 log4net。

但是,如果你真的需要一些简单的东西,可以考虑只使用一个单例来保存对 StreamWriter 的引用,该 StreamWriter 会在每个 WriteLine 上自动刷新。

因此,您可以在整个会话期间保持文件打开,避免关闭/打开开销,同时在发生硬崩溃时不冒丢失日志数据的风险。

于 2008-09-30T15:48:54.940 回答
0

一种简单的方法是提供一个 TextWriterTraceListener 并将其添加到 Trace 类的 TraceListeners 集合中。这将自动将所有 Trace.Write... 调用写入相应的文件。

于 2008-09-30T15:47:53.320 回答
0

像 log4net 这样的日志框架应该正确处理多线程。

可能还有一个有用的提示:日志记录严重污染了代码,使其可读性降低。您是否考虑过在编译时使用方面将日志记录功能注入代码?有关示例,请参见本文。

于 2008-10-01T05:51:28.797 回答