从控制台程序高效地记录到文本文件的方法

4
什么是最有效的方式从一个C#和.NET 2.2控制台程序记录日志到一个.txt文件中?我的程序会循环多次并输出基于用户需要的不同数据,因此我正在寻找最有效的方法来实现这一点。
我知道我可以每次重新打开流然后关闭它,但这样做每次只会写入一行,下一次程序重新循环(几秒钟后)就需要再次写入。在我看来,这似乎不太友好。
我使用了多个线程,它们都有输出数据要记录(在不同的线程上打开/关闭相同的文件或访问相同的文件可能不好)。“保持对自动刷新的流编写器的引用”听起来像是一个好主意,但我不知道该如何操作。

StreamWriter writer = File.AppendText("log.txt"); 是我最喜欢的!(一些关键词:单例模式,[MethodImpl(MethodImplOptions.Synchronized)]等) - Bitterblue
6个回答

16

考虑使用 log4net

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


3

我接受每次写一行代码都要打开和关闭文件带来的性能损失,这是出于可靠性考虑。如果你把所有内容保存在内存中,而发生了严重崩溃,就无法获得任何日志信息来协助排除故障。如果这不是你所关心的问题,那么保存在内存中肯定会提供更好的性能。


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


2

我认同使用log4net。

但如果你真的需要简单的东西,考虑只使用一个单例来持有对自动刷新每个WriteLine的StreamWriter的引用。

这样,在整个会话期间保持文件处于打开状态,避免了关闭/打开的开销,同时在发生硬件崩溃时不会丢失日志数据。


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

0

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

还有一个有用的提示:日志会显著污染代码,使其难以阅读。您考虑过在编译时使用aspect来注入日志功能吗?查看此文章了解 示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接