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.
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!