将console.writeLine()消息传递给文本文件

时间:2011-09-29 14:20:54

标签: c#-4.0 console-application

我想知道实现一个记录器的最佳方法是什么,它基本上会占用所有Console.WriteLine()个消息并吐出所有这些消息的文本文件。

我知道我可以使用StringBuilder并在.AppendLine出现Console.WriteLine的情况下通过Console.WriteLine填充所有消息...但我正在寻找比这更神奇的东西。在某些方法中,我不必在现有代码中编写与{{1}}一样多的代码行。

如果您错过了标签,那么这适用于C#4.0控制台应用程序。

2 个答案:

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

我做过类似的事情,效果很好。