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");