95 votes

Mise en miroir de la sortie de la console dans un fichier

Dans une application console C #, existe-t-il un moyen astucieux de mettre la sortie de la console en miroir dans un fichier texte?

Actuellement, je passe juste la même chaîne à Console.WriteLine et InstanceOfStreamWriter.WriteLine dans une méthode de journalisation.

120voto

BeowulfOF Points 3737

Cela peut être un plus de travail, mais je voudrais aller dans l'autre sens.

Instancier un TraceListener pour la console et un pour le fichier journal; par la suite, utiliser Trace.Write des déclarations dans votre code à la place de Console.Write. Il devient plus facile par la suite de supprimer le journal, ou la sortie de la console, ou pour fixer un autre mécanisme de journalisation.

static void Main(string[] args)
{
    Trace.Listeners.Clear();

    TextWriterTraceListener twtl = new TextWriterTraceListener(Path.Combine(Path.GetTempPath(), AppDomain.CurrentDomain.FriendlyName));
    twtl.Name = "TextLogger";
    twtl.TraceOutputOptions = TraceOptions.ThreadId | TraceOptions.DateTime;

    ConsoleTraceListener ctl = new ConsoleTraceListener(false);
    ctl.TraceOutputOptions = TraceOptions.DateTime;

    Trace.Listeners.Add(twtl);
    Trace.Listeners.Add(ctl);
    Trace.AutoFlush = true;

    Trace.WriteLine("The first line to be in the logfile and on the console.");
}

Aussi loin que je puisse me rappeler, vous pouvez définir les auditeurs dans la configuration de l'application, rendant possible d'activer ou de désactiver la journalisation, sans toucher à la construire.

59voto

Christian Points 151

Il s'agit d'une classe simple qui sous-classe TextWriter pour permettre la redirection de l'entrée vers un fichier et la console.

Utilisez-le comme ça

   using (var cc = new ConsoleCopy("mylogfile.txt"))
  {
    Console.WriteLine("testing 1-2-3");
    Console.WriteLine("testing 4-5-6");
    Console.ReadKey();
  }
 

Voici la classe:

 class ConsoleCopy : IDisposable
{

  FileStream fileStream;
  StreamWriter fileWriter;
  TextWriter doubleWriter;
  TextWriter oldOut;

  class DoubleWriter : TextWriter
  {

    TextWriter one;
    TextWriter two;

    public DoubleWriter(TextWriter one, TextWriter two)
    {
      this.one = one;
      this.two = two;
    }

    public override Encoding Encoding
    {
      get { return one.Encoding; }
    }

    public override void Flush()
    {
      one.Flush();
      two.Flush();
    }

    public override void Write(char value)
    {
      one.Write(value);
      two.Write(value);
    }

  }

  public ConsoleCopy(string path)
  {
    oldOut = Console.Out;

    try
    {
      fileStream = File.Create(path);

      fileWriter = new StreamWriter(fileStream);
      fileWriter.AutoFlush = true;

      doubleWriter = new DoubleWriter(fileWriter, oldOut);
    }
    catch (Exception e)
    {
      Console.WriteLine("Cannot open file for writing");
      Console.WriteLine(e.Message);
      return;
    }
    Console.SetOut(doubleWriter);
  }

  public void Dispose()
  {
    Console.SetOut(oldOut);
    if (fileWriter != null)
    {
      fileWriter.Flush();
      fileWriter.Close();
      fileWriter = null;
    }
    if (fileStream != null)
    {
      fileStream.Close();
      fileStream = null;
    }
  }

}
 

13voto

tvanfosson Points 268301

Découvrez log4net . Avec log4net, vous pouvez configurer des appenders pour la console et les fichiers qui peuvent envoyer des messages de journal aux deux endroits avec une seule instruction de journal.

10voto

xtofl Points 22333

Ne pouvez-vous pas simplement rediriger la sortie vers un fichier en utilisant la commande > ?

 c:\>Console.exe > c:/temp/output.txt
 

Si vous devez mettre en miroir, vous pouvez essayer de trouver une version Win32 de tee qui divise la sortie en fichier.

8voto

arul Points 10719

Vous pourriez sous-classe de la classe TextWriter, puis attribuez-lui un exemple à la Console.À l'aide de la Console.Sera de la méthode qui fait la même chose que de passage sur la même chaîne pour les deux méthodes dans le journal de la méthode.

Une autre voie pourrait déclarer votre propre Console de classe et d'utiliser l'instruction à l'aide de distinguer entre les classes:

using Console = My.Very.Own.Little.Console;

Pour accéder à la console standard vous auriez alors besoin de:

global::Console.Whatever

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X