コンソールアプリで画面とログファイルに同時に書き込む方法

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.

この記事をシェアする
Tweet about this on Twitter
Twitter
Share on Facebook
Facebook
0

Comments

Comments