2011-09-29 109 views
1

我想知道实现一个记录器时最好的方法是什么,它基本上消耗所有的Console.WriteLine()消息并且吐出所有这些消息的文本文件。将console.writeLine()消息传递到文本文件

我知道我可以使用一个StringBuilderConsole.WriteLine发生于做.AppendLine所有的消息来填充它......但我要寻找的东西比这更神奇。使用这种方式,我不必在现有代码中编写与Console.WriteLine s一样多的代码行。

如果您错过了标签,这是针对C#4.0控制台应用程序的。

回答

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的有用实例。”

我已经做了类似的事情,它工作得很好。

+0

还没有尝试过......但这听起来没错。标记为答案。谢谢! – aateeque

2

代替在代码中使用Console.Write,请使用Trace.Write。然后在配置文件中,将ConsoleTraceListener附加到跟踪侦听器。

这种技术将允许你跟踪,跟踪框架将它输出到控制台和你设置的任何跟踪监听器(可能是你的案例中的TextWriterTraceListener)。

某些第三方库(log4not进入我的想法)允许封装所有的记录机制。