【C#】Consoleの出力先を変更する

Consoleの出力先をファイルにしたりカスタムクラス用いて任意の出力先を設定する方法です。

確認環境

  • Windows11
  • VisualStudio2022
  • .NET 7.0

.NET 7.0 で確認しましたがどの環境でも同じです。

Consoleの出力先の変更方法

以下のメソッドで出力先を変更できます。

// 出力先を変更するメソッド
Console.SetOut(TextWriter newOut);

Consoleの出力先をファイルに変更する

TextWriter を継承したクラスに StreamWriter があるので以下のようにするとファイルに書き出すように変更できます。

// Consoleの内容をファイルに出力するように変更する
StreamWriter newOut = new StreamWriter(@"d:\sample.txt", true, Encoding.UTF8);
Console.SetOut(newOut);

Console.WriteLine("Test"); // d:\sample.txtにTestが書きこまれる

変更した後に出力先を元に戻す

いちど SetOut で出力先を変更すると元に戻せなくなるので後でコンソール出力を復元したい場合事前に Console.Out でインスタンスを保持しておきます。

// 事前にインスタンスを保持しておく
var defaultOut = Console.Out;

// 出力先を変更する
var foroed = new ConsoleAndTraceWriter(Console.Out);
Console.SetOut(foroed);

// コンソール出力するように戻す
Console.SetOut(defaultOut);

カスタム出力先を指定する

SetOut には TextWriter を継承しているクラスが設定できるため以下のように TextWriter を継承したクラスを自作すれば任意の出力先に内容を転送できます。

以下例では Trace に内容を転送してます。

// TraceWriter.cs

using System.Diagnostics;
using System.IO;
using System.Text;

// Consoleへの出力をTraceへ転送するためのクラス
public class TraceWriter : TextWriter
{
    // TextWriterからの要請で実装
    public override Encoding Encoding => Encoding.UTF8;

    // 既定の初期値でオブジェクトを初期化するコンストラクタ
    public TraceWriter() { }

    // Overrideしていないメンバーが呼ばれた時に呼び出される
    public override void Write(string value) => Trace.Write(value);

    // Console.WriteLine(string)が呼ばれた時に呼び出される
    public override void WriteLine(string value) => Trace.WriteLine(value);
}

Consoleとトレースに同時に出力する

// TraceConsoleWriter.cs

// TraceとConsoleに同時に出力するためのクラス
public class TraceConsoleWriter : TextWriter
{
    public readonly TextWriter Console;

    public override Encoding Encoding => Encoding.UTF8;

    public TraceConsoleWriter(TextWriter consoleOut) => Console = consoleOut;

    public override void Write(string value)
    {
        Console.Write(value);
        Trace.Write(value);
    }

    public override void WriteLine(string value)
    {
        Console.WriteLine(value);
        Trace.WriteLine(value);
    }
}

使い方は以下の通りです。

var newOut = new TraceConsoleWriter(Console.Out);
Console.SetOut(newOut);

// ConsoleとTraceに同時に出力される
Console.WriteLine("hogehoge1");
Console.WriteLine("hogehoge2");
Console.WriteLine("hogehoge3");