从C#和.NET 2.2上的控制台程序记录到日志(.txt)的最有效方法是什么?我的程序循环多次总是根据用户的需要输出不同的数据,所以我正在寻找最有效的方法来实现这一点。
我知道我总是可以重新打开一个流然后关闭它,但每次我这样做它只会写一行,然后下一次(几秒钟后)程序重新启动并需要再次写入。在我看来,这似乎并不是非常友好的。
我正在使用多个线程,这些线程都有我想要记录的输出数据(打开/关闭同一个文件或在不同的线程上访问同一个文件可能不好)。 “拥有对自动刷新的流编写器的引用”听起来像个好主意,但我不知道该怎么做。
答案 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>
您还可以将监听器附加到事件日志或您感兴趣的任何其他地方。有关跟踪框架的更多信息,请访问:
答案 3 :(得分:2)
我同意使用log4net。
但是如果你真的需要一些简单的东西,可以考虑让一个单例来保存对每个WriteLine上自动刷新的StreamWriter的引用。
因此,您可以在整个会话期间保持文件打开,避免关闭/打开开销,同时不会在发生严重崩溃时丢失日志数据。
答案 4 :(得分:0)
一种简单的方法是提供TextWriterTraceListener并将其添加到Trace类的TraceListeners集合中。这将自动将所有Trace.Write ...调用写入相应的文件。
答案 5 :(得分:0)
像log4net这样的日志框架应该正确处理多线程。
可能还有一个有用的提示:日志记录会严重污染代码,使其可读性降低。您是否考虑在编译时使用aspect为代码注入日志记录功能?请参阅此文章了解example。