我想知道实现一个记录器的最佳方法是什么,它基本上会占用所有Console.WriteLine()
个消息并吐出所有这些消息的文本文件。
我知道我可以使用StringBuilder
并在.AppendLine
出现Console.WriteLine
的情况下通过Console.WriteLine
填充所有消息...但我正在寻找比这更神奇的东西。在某些方法中,我不必在现有代码中编写与{{1}}一样多的代码行。
如果您错过了标签,那么这适用于C#4.0控制台应用程序。
答案 0 :(得分:2)
不要在代码中使用Console.Write
,而是使用Trace.Write
。然后在配置文件中,将ConsoleTraceListener
附加到跟踪侦听器。
此技术将允许您跟踪,并且跟踪框架将它输出到控制台和您设置的任何跟踪侦听器(在您的情况下可能是TextWriterTraceListener)。
一些第三方lib(log4not进入我的脑海)也允许封装所有日志记录机制。
答案 1 :(得分:0)
我假设你想要的是一个写入标准输出和文件的流。也就是说,您希望一切仍然显示在控制台上,但您也希望将其写入文件。 (如果您只想将输出重定向到文件,可以从命令行执行此操作。)
您需要创建自己的TextWriter
派生类,并让它执行实际输出。您致电Console.SetOut
以使控制台写入TextWriter
。
class ConsoleLogger: TextWriter
{
private TextWriter ConsoleOutputStream;
private StreamWriter LogOutputStream;
public ConsoleLogger(string logFilename)
{
ConsoleOutputStream = Console.Out;
// Initialize your log file
LogOutputStream = new StreamWriter(logFilename);
}
public void Write(string s)
{
ConsoleOutputStream.Write(s);
LogOutputStream.Write(s);
}
// Other Write functions format their arguments and call Write(string).
}
在使用它的程序中:
private ConsoleLogger MyLogger;
const string LogFilename = "ConsoleLog.txt";
void Main()
{
MyLogger = new ConsoleLogger(LogFilename);
Console.SetOut(MyLogger);
}
您不必覆盖所有TextWriter
方法。正如documentation所说,“派生类必须最低限度地实现TextWriter.Write(Char)
方法,才能创建TextWriter
的有用实例。”
我做过类似的事情,效果很好。