Cómo guardar la salida de Console.WriteLine en un archivo de texto


98

Tengo un programa que genera varios resultados en una consola de línea de comandos.

¿Cómo guardo la salida en un archivo de texto usando una StreamReaderu otras técnicas?

System.Collections.Generic.IEnumerable<String> lines = File.ReadAllLines(@"C:\Test\ntfs8.txt");

foreach (String r in lines.Skip(1))
{
    String[] token = r.Split(',');
    String[] datetime = token[0].Split(' ');
    String timeText = datetime[4];
    String actions = token[2];
    Console.WriteLine("The time for this array is: " + timeText);
    Console.WriteLine(token[7]);
    Console.WriteLine(actions);
    MacActions(actions);
    x = 1;
    Console.WriteLine("================================================");
}

if (x == 2)
{
    Console.WriteLine("The selected time does not exist within the log files!");
}

System.IO.StreamReader reader = ;
string sRes = reader.ReadToEnd();
StreamWriter SW;
SW = File.CreateText("C:\\temp\\test.bodyfile");
SW.WriteLine(sRes);
SW.Close();
Console.WriteLine("File Created");
reader.Close();

Respuestas:


150

Pruebe este ejemplo de este artículo: demuestra cómo redirigir la salida de la consola a un archivo

using System;
using System.IO;

static public void Main ()
{
    FileStream ostrm;
    StreamWriter writer;
    TextWriter oldOut = Console.Out;
    try
    {
        ostrm = new FileStream ("./Redirect.txt", FileMode.OpenOrCreate, FileAccess.Write);
        writer = new StreamWriter (ostrm);
    }
    catch (Exception e)
    {
        Console.WriteLine ("Cannot open Redirect.txt for writing");
        Console.WriteLine (e.Message);
        return;
    }
    Console.SetOut (writer);
    Console.WriteLine ("This is a line of text");
    Console.WriteLine ("Everything written to Console.Write() or");
    Console.WriteLine ("Console.WriteLine() will be written to a file");
    Console.SetOut (oldOut);
    writer.Close();
    ostrm.Close();
    Console.WriteLine ("Done");
}

1
agregué esto a mi plantilla de consola de prueba estándar.
Valamas

¿Es posible solo usando app.config, no programáticamente, sección system.diagnostics? ¿Alguna muestra?
Kiquenet

¿No es mejor usar usando ?
John

Escribí una pequeña clase de utilidad ( DebugLogger) que incluyo en todas mis pruebas unitarias y la inicializo como private static readonly. En el [ClassCleanup]método que ejecutoDispose()
IAbstract

16
Me pregunto si puede mostrar la salida en la consola y guardarla en un archivo al mismo tiempo.
John Alexiou

54

Prueba si esto funciona:

FileStream filestream = new FileStream("out.txt", FileMode.Create);
var streamwriter = new StreamWriter(filestream);
streamwriter.AutoFlush = true;
Console.SetOut(streamwriter);
Console.SetError(streamwriter);

3
Excelente respuesta: tenga en cuenta que esto redirecciona la salida de la consola, por lo que solo obtiene el registro. Además, puede utilizar FileMode.Append para mantener registros anteriores.
Dunc

3
Console.SetOut(System.IO.TextWriter.Null)si desea apagar el registro.
suma de comprobación

22

Para la pregunta:

¿Cómo guardar las salidas de Console.Writeline en un archivo de texto?

Usaría Console.SetOutcomo otros han mencionado.


Sin embargo, parece más como si estuviera realizando un seguimiento del flujo de su programa. Consideraría usar Debugo Tracerealizar un seguimiento del estado del programa.

Funciona de manera similar a la consola, excepto que tiene más control sobre su entrada, como WriteLineIf.

Debugsolo funcionará cuando esté en modo de depuración, mientras Traceque as funcionará tanto en modo de depuración como de liberación.

Ambos permiten oyentes como archivos de salida o la consola.

TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);
Debug.Listeners.Add(tr1);

TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("Output.txt"));
Debug.Listeners.Add(tr2);

- http://support.microsoft.com/kb/815788


14

¿desea escribir código para eso o simplemente usar la función de línea de comandos 'redirección de comandos' de la siguiente manera:

app.exe >> salida.txt

como se demuestra aquí: http://discomoose.org/2006/05/01/output-redirection-to-a-file-from-the-windows-command-line/ (Archivado en archive.org )

EDITAR: enlace muerto, aquí hay otro ejemplo: http://pcsupport.about.com/od/commandlinereference/a/redirect-command-output-to-file.htm


Esta solución es mejor para mí porque descubrí que mi salida se truncó usando la solución TextWriter. Si desea un enlace nuevo, busque Redirección de comandos, por ejemplo. technet.microsoft.com/en-us/library/bb490982.aspx
mafue

El uso de la función de redireccionamiento en, por ejemplo, archivos bat / cmd hace que la salida se convierta a la página de códigos 850.
galmok

5

Cree una clase Logger (código a continuación), reemplace Console.WriteLine con Logger.Out. Al final, escriba en un archivo la cadena Log

public static class Logger
{        
     public static StringBuilder LogString = new StringBuilder(); 
     public static void Out(string str)
     {
         Console.WriteLine(str);
         LogString.Append(str).Append(Environment.NewLine);
     }
 }

Esto es exactamente lo que estaba buscando.
Jhollman


2

Basado en la respuesta de WhoIsNinja:

Este código se generará tanto en la consola como en una cadena de registro que se puede guardar en un archivo, ya sea agregándole líneas o sobrescribiéndolo.

El nombre predeterminado para el archivo de registro es 'Log.txt' y se guarda en la ruta de la aplicación.

public static class Logger
{
    public static StringBuilder LogString = new StringBuilder();
    public static void WriteLine(string str)
    {
        Console.WriteLine(str);
        LogString.Append(str).Append(Environment.NewLine);
    }
    public static void Write(string str)
    {
        Console.Write(str);
        LogString.Append(str);

    }
    public static void SaveLog(bool Append = false, string Path = "./Log.txt")
    {
        if (LogString != null && LogString.Length > 0)
        {
            if (Append)
            {
                using (StreamWriter file = System.IO.File.AppendText(Path))
                {
                    file.Write(LogString.ToString());
                    file.Close();
                    file.Dispose();
                }
            }
            else
            {
                using (System.IO.StreamWriter file = new System.IO.StreamWriter(Path))
                {
                    file.Write(LogString.ToString());
                    file.Close();
                    file.Dispose();
                }
            }               
        }
    }
}

Entonces puedes usarlo así:

Logger.WriteLine("==========================================================");
Logger.Write("Loading 'AttendPunch'".PadRight(35, '.'));
Logger.WriteLine("OK.");

Logger.SaveLog(true); //<- default 'false', 'true' Append the log to an existing file.

1
Si bien es genial, pierde la funcionalidad de formato integrada en Console.WriteyConsole.WriteLine
Cole Johnson

1

Usando solo la configuración en su app.config:

    <system.diagnostics> 
        <trace autoflush="true" indentsize="4"> 
              <listeners> 

              <add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener"/>

            <!--
            <add name="logListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="TextWriterOutput.log" /> 
            <add name="EventLogListener" type="System.Diagnostics.EventLogTraceListener" initializeData="MyEventLog"/>
             -->

             <!--
              Remove the Default listener to avoid duplicate messages
              being sent to the debugger for display
             -->
             <remove name="Default" />

             </listeners> 
        </trace> 
  </system.diagnostics>

Para las pruebas, puede usar DebugView antes de ejecutar el programa, luego podemos ver fácilmente todos los mensajes de registro.

Referencias:
http://blogs.msdn.com/b/jjameson/archive/2009/06/18/configuring-logging-in-a-console-application.aspx http://www.thejoyofcode.com/from_zero_to_logging_with_system_diagnostics_in_15_minutes.aspx
Redirigir la salida de seguimiento a la consola
Problema al redirigir la salida de depuración a un archivo utilizando el detector de seguimiento
https://ukadcdiagnostics.codeplex.com/
http://geekswithblogs.net/theunstablemind/archive/2009/09/09/adventures-in-system.diagnostics .aspx


¿No funcionaría esto con Trace.WriteLine y no con Console.WriteLine?
Tomer Cagan

@TomerCagan Quizás usando ConsoleTraceListener y Console.SetOut. Más información en referencias.
Kiquenet
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.