Guardar la salida de Console.WriteLine en un archivo con C#

Hace un par de días monté una aplicación de consola que mostraba el resultado de las operaciones que iban finalizado. Al cabo de unas horas me di cuenta de que la información era cada vez más y más y era muy difícil leerla directamente desde la ventana y, debido al scroll, los datos más antiguos habían desaparecido para dar paso a los nuevos. Lo primero que se me ocurrió fue pausar la consola cada cierto tiempo utilizando Console.ReadLine(), pero resultaba molesto tener que pulsar Intro cada vez que quisiera que el programa siguiera avanzando. Tampoco quería modificar el código y reemplazar Console.WriteLine por Trace.TraceInformation, ya que entendía que la información no tenía el fin de ser una traza sino mostrar el resultado de las operaciones. Finalmente opté por guardar toda la información que estaba mostrando utilizando Console.WriteLine en un fichero de texto plano.

Guardar la salida de Console.WriteLine en un archivo con csharp

Como puedes imaginar, es posible modificar la salida de las clase Console, que por defecto muestra la información por pantalla, para que la misma se almacene, por ejemplo, en un fichero.

using System;
using System.IO;

namespace ConsoleApplicationChangeOutputStream
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args == null) throw new ArgumentNullException("args");

            //1. Get the name of the output file
            var fileName = args[0];

            //2. Create the file
            var file = new FileStream(fileName, FileMode.OpenOrCreate);

            //3. Save the standard output
            var standardOutput = Console.Out;

            //4. Testing the console before changing the output
            Console.WriteLine("Hello world from the console!");

            //5. Create a StreamWriter
            using (var writer = new StreamWriter(file))
            {
                //6. Set the new output
                Console.SetOut(writer);
                //7. Write something
                Console.WriteLine("Hello World from the file!");
                //8. Change the ouput again
                Console.SetOut(standardOutput);
            }

            //9. Last testing
            Console.WriteLine("Here I am again!");

            //10. The end
            Console.Read();

        }
    }
}

Como se puede ver en el código, se almacena en una variable la salida actual, con el objetivo de volver a restaurarla en un futuro, se crea un archivo con el nombre pasado por parámetro, utilizando Debug > Command line arguments, y se crea un objeto del tipo StreamWriter que será asignado como salida para la clase estática Console. A partir de este momento, todo lo que mandemos a la aplicación de consola a través de Write o WriteLine no será mostrado en la ventana, sino que será almacenado directamente en el archivo de texto. Otra alternativa sería combinar ambas salidas para que pudiéramos visualizar en tiempo real la información que se está almacenado. También es posible que te pueda interesar la librería Log4Net para trazar tus aplicaciones, la cual hace uso de esta funcionalidad.

¡Saludos!