Console Capture Override Using LINQPad - adamzuckerman/first-timer GitHub Wiki

This is some test code I wrote to see if I could capture the Console output so that it could be logged to a file as well as being displayed on the console window.

    private System.IO.TextWriter origConsoleOut = Console.Out;
    
    void Main()
    {
      using (var consoleWriter = new ConsoleWriter())
      {
        consoleWriter.WriteEvent += consoleWriter_WriteEvent;
        consoleWriter.WriteLineEvent += consoleWriter_WriteLineEvent;
    
        Console.SetOut(consoleWriter);
        
        Console.WriteLine("This should be buffered.");
        
        Console.SetOut(origConsoleOut);
        
        Console.WriteLine("This should be unbuffered.");
        
        Console.SetOut(consoleWriter);
        
        Console.WriteLine("This should also be buffered.");
        
        Console.SetOut(origConsoleOut);
        
        Console.WriteLine();
        Console.WriteLine("This should also be unbuffered.");
        consoleWriter.Log.Dump();
      }
    }
    
    // Define other methods and classes here
    
    static void consoleWriter_WriteLineEvent(object sender, ConsoleWriterEventArgs e)
    {
      // Do something with the data sent by the event
    }
    
    static void consoleWriter_WriteEvent(object sender, ConsoleWriterEventArgs e)
    {
      // Do something with the data sent by the event
    }
    
    public class ConsoleWriterEventArgs : EventArgs
    {
      public string Value { get; private set; }
      public ConsoleWriterEventArgs(string value)
      {
        Value = value;
      }
    }
    
    public class ConsoleWriter : TextWriter
    {
      private StringBuilder log;
      
      public ConsoleWriter() : base()
      {
        log = new StringBuilder();
      }
      public override Encoding Encoding { get { return Encoding.UTF8; } }
      public string Log { get { return log.ToString(); } }
    
      public override void Write(string value)
      {
        if (WriteEvent != null) WriteEvent(this, new ConsoleWriterEventArgs(value));
        log.Append(value);
        base.Write(value);
      }
    
      public override void WriteLine(string value)
      {
        if (WriteLineEvent != null) WriteLineEvent(this, new ConsoleWriterEventArgs(value));
        log.AppendLine(value);
        base.WriteLine(value);
      }
    
      public event EventHandler<ConsoleWriterEventArgs> WriteEvent;
      public event EventHandler<ConsoleWriterEventArgs> WriteLineEvent;
    }