2

I have a program that takes the Console output and writes it to a logfile, however it no longer shows up in the console window. Is there a way to keep it in the window but write it to the log file as well?

Update:

appLogStream = new FileStream(logFile, FileMode.Append, FileAccess.Write, FileShare.Read);
TextWriter logtxtWriter = Console.Out;
logstrmWriter = new StreamWriter(appLogStream);
if(!console) Console.SetOut(logstrmWriter);
logstrmWriter.AutoFlush = true;
Console.WriteLine("Started at " + DateTime.Now);

console is a constant set in the class. It basically tells it whether it is using the console window or not (readline is not called, etc, if not in console).

So is there a way to write to both the console and the file?

4

3 回答 3

2

您可以简单地读取该流日志并将其打印出来。

如果您将输出流分配给 outfile 的输入流,这在一定程度上取决于您的代码,如果您将内容读取到应该更容易一点的缓冲区,这可能会有点困难。


关于您的更新,我建议您Console使用自定义日志记录功能交换所有内容,例如 MyLogger 的实例(代码如下)。它将您的输出写入控制台和日志文件。

class MyLogger {
    private FileStream appLogStream;

    public MyLogger() {
        appLogStream = new FileStream(logFile, FileMode.Append, FileAccess.Write,
                                      FileShare.Read);
        appLogStream.WriteLine("Started at " + DateTime.Now);
    }

    public Write(string msg) {
        Console.Write(msg);
        appLogStream.Write(msg);
    }

    public WriteLine(string msg) {
        Console.WriteLine(msg);
        appLogStream.WriteLine(msg);
    }
}
于 2012-06-06T16:21:46.627 回答
1

我认为你可以这样做:

 public class ConsoleDecorator : TextWriter
{
    private TextWriter m_OriginalConsoleStream;

    public ConsoleDecorator(TextWriter consoleTextWriter)
    {
        m_OriginalConsoleStream = consoleTextWriter;
    }

    public override void WriteLine(string value)
    {
        m_OriginalConsoleStream.WriteLine(value);

        // Fire event here with value
    }


    public static void SetToConsole()
    {
        Console.SetOut(new ConsoleDecorator(Console.Out));
    }
}

您必须通过调用 ConsoleDecorator.SetToConsole(); 来“注册”包装器;之后,每个 Console.WriteLine 调用都将到达自定义方法,您可以在那里触发事件并获取写入其他位置的文本(例如日志记录)。

如果您想使用这种方式,则必须使该类成为单例,然后您可以访问其他类的偶数注册(当偶数被触发时应该写入日志文件)

于 2012-06-06T16:32:02.367 回答
0

当您调用 Console.SetOut 时,您指定 Console 应写入的位置。如果您没有(即通常使用 Console 的方式),并且您调用 Console.Write,它会检查它是否有输出写入器,如果没有,则将其设置为

   stream = OpenStandardOutput(256);

接着

        Encoding encoding = Encoding.GetEncoding((int) Win32Native.GetConsoleOutputCP());
        writer = TextWriter.Synchronized(new StreamWriter(stream, encoding, 256, false) { HaveWrittenPreamble = true, AutoFlush = true });

所以你应该能够做你现在正在做的事情,如果你还想将所有内容都回显到标准输出,就好像你没有重定向控制台一样,你可以使用你自己使用Console.OpenStandardOutput方法打开的流来创建自己的编写器。该Win32Native代码中使用的 是内部的,因此您无权访问它,但您可以使用Console.OutputEncoding来检索它正在使用的编码。

您还可以尝试Console.Out在调用 SetOut 之前使用该属性获取并挂起标准输出 TextWriter。然后你可以用它来回显到标准输出。

于 2012-06-06T16:34:54.093 回答