从控制台程序记录到txt文件的有效方法

时间:2008-09-30 15:36:47

标签: c# .net performance logging

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

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

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

6 个答案:

答案 0 :(得分:16)

考虑使用log4net

  

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

答案 1 :(得分:3)

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

答案 2 :(得分: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

答案 3 :(得分:2)

我同意使用log4net。

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

可能还有一个有用的提示:日志记录会严重污染代码,使其可读性降低。您是否考虑在编译时使用aspect为代码注入日志记录功能?请参阅此文章了解example