Como salvar a saída Console.WriteLine em um arquivo de texto


98

Eu tenho um programa que produz vários resultados em um console de linha de comando.

Como faço para salvar a saída em um arquivo de texto usando uma StreamReaderou outras 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();

Possível duplicata da saída do console
Michael Freidgeim

Respostas:


150

Experimente este exemplo deste artigo - demonstra o redirecionamento da saída do console para um arquivo

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
adicionei isso ao meu modelo de console de teste padrão.
Valamas

É possível usar apenas app.config, não programaticamente, seção system.diagnostics? Qualquer amostra?
Kiquenet

Não é melhor usar usando ?
John

Eu escrevi uma pequena classe de utilitário ( DebugLogger) que incluo em todos os meus testes de unidade e inicializo como um private static readonly. No [ClassCleanup]método que eu executoDispose()
IAbstract de

16
Gostaria de saber se você pode mostrar a saída no console e salvá-la em um arquivo ao mesmo tempo.
John Alexiou

54

Experimente se isso funciona:

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

3
Ótima resposta - observe que isso redireciona a saída do console, para que você obtenha apenas o registro. Além disso, você pode usar FileMode.Append para manter os logs anteriores.
Dunc

3
Console.SetOut(System.IO.TextWriter.Null)se você quiser desligar o log.
checksum

22

Para a pergunta:

Como salvar as saídas Console.Writeline em um arquivo de texto?

Eu usaria Console.SetOutcomo outros mencionaram.


No entanto, parece mais que você está acompanhando o fluxo do programa. Eu consideraria usar Debugou Tracepara acompanhar o estado do programa.

Funciona de forma semelhante ao console, exceto que você tem mais controle sobre sua entrada, como WriteLineIf.

Debugsó operará quando estiver no modo de depuração, onde as Traceoperará tanto no modo de depuração quanto no modo de liberação.

Ambos permitem ouvintes, como arquivos de saída ou o console.

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

deseja escrever um código para isso ou apenas usar o recurso de linha de comando 'redirecionamento de comando' da seguinte maneira:

app.exe >> output.txt

conforme demonstrado aqui: http://discomoose.org/2006/05/01/output-redirection-to-a-file-from-the-windows-command-line/ (arquivado em archive.org )

EDIT: link morto, aqui está outro exemplo: http://pcsupport.about.com/od/commandlinereference/a/redirect-command-output-to-file.htm


Esta solução é melhor para mim porque descobri que minha saída foi truncada usando a solução TextWriter. Se você quiser um novo link, pesquise por Redirecionamento de Comando, por exemplo. technet.microsoft.com/en-us/library/bb490982.aspx
mafue

Usar o recurso de redirecionamento em, por exemplo, arquivos bat / cmd faz com que a saída seja convertida para a página de códigos 850.
galmok

5

Crie uma classe Logger (código abaixo), substitua Console.WriteLine por Logger.Out. No final, escreva para um arquivo a string 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);
     }
 }

Isso é exatamente o que eu estava procurando.
Jhollman


2

Baseado na resposta de WhoIsNinja:

Esse código será gerado no Console e em uma string de Log que pode ser salva em um arquivo, acrescentando linhas a ele ou substituindo-o.

O nome padrão do arquivo de log é 'Log.txt' e é salvo no caminho do aplicativo.

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();
                }
            }               
        }
    }
}

Então você pode usá-lo assim:

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
Embora seja ótimo, você perde a funcionalidade de formatação embutida no Console.WriteeConsole.WriteLine
Cole Johnson

1

Usando apenas a configuração em seu 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 teste, você pode usar DebugView antes de executar o programa, então podemos ver facilmente todas as mensagens de log.

Referências:
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
Redirecionar a saída de rastreamento para o console
Problema ao redirecionar a saída de depuração para um arquivo usando o listener de rastreamento
https://ukadcdiagnostics.codeplex.com/
http://geekswithblogs.net/theunstablemind/archive/2009/09/09/adventures-in-system.diagnostics .aspx


Isso não funcionaria com Trace.WriteLine e não Console.WriteLine?
Tomer Cagan,

@TomerCagan Talvez usando ConsoleTraceListener e Console.SetOut. Mais informações nas referências.
Kiquenet
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.