C#やVB.NETで作ったコンソールアプリで、コンソールへのメッセージをConsole.SetOutを使ってログファイルに簡単に書き込むことができますが、そうすると画面には何も表示されず、何かあった時に毎回ログファイルを確認しなければなりません。
そんな時は以下の方法を使うことで、画面とログファイル両方に書き出すことが可能です。
(※2015/8/10 VB.NETのコードも追記しました。)
宣言
C#のコード
using System; using System.IO; private static StreamWriter sw, standard;//ログ記録用 //Console画面とログファイルへの同時出力用 private static void ConsoleLog(StreamWriter sw, string msg) { //ログファイルへ出力 Console.SetOut(sw); Console.WriteLine(msg); sw.Flush(); //Console画面へ出力 Console.SetOut(standard); Console.WriteLine(msg); standard.Flush(); }
VB.NETのコード
Imports System Imports System.IO Private Shared sw As StreamWriter, standard As StreamWriter 'ログ記録用 'Console画面とログファイルへの同時出力用 Private Shared Sub ConsoleLog(sw As StreamWriter, msg As String) 'ログファイルへ出力 Console.SetOut(sw) Console.WriteLine(msg) sw.Flush() 'Console画面へ出力 Console.SetOut(standard) Console.WriteLine(msg) standard.Flush() End Sub
初期設定(使う前に宣言する)
C#のコード
//ログ出力設定 sw = new StreamWriter(DateTime.Now.ToString("yyyyMMdd") + ".log", true, System.Text.Encoding.GetEncoding("Shift_JIS")); standard = new StreamWriter(Console.OpenStandardOutput(), System.Text.Encoding.GetEncoding("Shift_JIS"));
VB.NETのコード
'ログ出力設定 sw = New StreamWriter(DateTime.Now.ToString("yyyyMMdd") & ".log", True, System.Text.Encoding.GetEncoding("Shift_JIS")) standard = New StreamWriter(Console.OpenStandardOutput(), System.Text.Encoding.GetEncoding("Shift_JIS"))
使い方サンプル
使いたい場所に以下のようなコードを追加して使用します。
C#のコード
try { ConsoleLog(sw, "開始:" + DateTime.Now.ToString()); //何かの処理 ConsoleLog(sw, "終了: " + DateTime.Now.ToString()); } catch (Exception ex) { ConsoleLog(sw, "Error: " + ex.Message); }
VB.NETのコード
Try ConsoleLog(sw, "開始:" & DateTime.Now.ToString()) '何かの処理 ConsoleLog(sw, "終了: " & DateTime.Now.ToString()) Catch ex As Exception ConsoleLog(sw, "Error: " & ex.Message) End Try
この代償として、Format形式を利用した出力はできなくなってしまうので、少しだけ面倒になってしまいます。気になる方はオーバーロードで頑張って作ってください。
Search Index:
How to do logging and Command Output in console application.
how to Console.SetOut and Console.WriteLine dual use.