2

コンソール出力を取得してログファイルに書き込むプログラムがありますが、コンソールウィンドウに表示されなくなりました。ウィンドウに保持しながら、ログファイルにも書き込む方法はありますか?

アップデート:

appLogStream = new FileStream(logFile, FileMode.Append, FileAccess.Write, FileShare.Read);
TextWriter logtxtWriter = Console.Out;
logstrmWriter = new StreamWriter(appLogStream);
if(!console) Console.SetOut(logstrmWriter);
logstrmWriter.AutoFlush = true;
Console.WriteLine("Started at " + DateTime.Now);

consoleは、クラスで設定される定数です。基本的に、コンソールウィンドウを使用しているかどうかを示します(コンソールにない場合は、readlineは呼び出されません。

では、コンソールとファイルの両方に書き込む方法はありますか?

4

3 に答える 3

2

そのストリームを読み取ってログに記録し、印刷するだけです。

出力ストリームを出力ファイルの入力ストリームに割り当てる場合は、コードに少し依存します。コンテンツを少し簡単なバッファーに読み取る場合、これは少し難しくなる可能性があります。


アップデートについては、すべてConsoleをカスタムロギング関数(MyLoggerのインスタンス(以下のコード)など)と交換することをお勧めします。これにより、出力がコンソールとログファイルに書き込まれます。

class MyLogger {
    private FileStream appLogStream;

    public MyLogger() {
        appLogStream = new FileStream(logFile, FileMode.Append, FileAccess.Write,
                                      FileShare.Read);
        appLogStream.WriteLine("Started at " + DateTime.Now);
    }

    public Write(string msg) {
        Console.Write(msg);
        appLogStream.Write(msg);
    }

    public WriteLine(string msg) {
        Console.WriteLine(msg);
        appLogStream.WriteLine(msg);
    }
}
于 2012-06-06T16:21:46.627 に答える
1

私はあなたがこのようなことをすることができると思います:

 public class ConsoleDecorator : TextWriter
{
    private TextWriter m_OriginalConsoleStream;

    public ConsoleDecorator(TextWriter consoleTextWriter)
    {
        m_OriginalConsoleStream = consoleTextWriter;
    }

    public override void WriteLine(string value)
    {
        m_OriginalConsoleStream.WriteLine(value);

        // Fire event here with value
    }


    public static void SetToConsole()
    {
        Console.SetOut(new ConsoleDecorator(Console.Out));
    }
}

ConsoleDecorator.SetToConsole();を呼び出してラッパーを「登録」する必要があります。その後、すべてのConsole.WriteLine呼び出しがカスタムメソッドに到達し、そこでイベントを発生させて、他の場所(ログなど)にテキストを書き込むことができます。

そのように使用する場合は、クラスをシングルトンにする必要があります。そうすれば、他のクラスからの偶数登録にアクセスできます(偶数が起動されたときにログファイルに書き込むことになっています)。

于 2012-06-06T16:32:02.367 に答える
0

Console.SetOutを呼び出すときは、コンソールが書き込む場所を指定します。そうでない場合(つまり、コンソールが通常使用される方法)、Console.Writeを呼び出すと、出力ライターがあるかどうかがチェックされ、ない場合は、次のように設定されます。

   stream = OpenStandardOutput(256);

その後

        Encoding encoding = Encoding.GetEncoding((int) Win32Native.GetConsoleOutputCP());
        writer = TextWriter.Synchronized(new StreamWriter(stream, encoding, 256, false) { HaveWrittenPreamble = true, AutoFlush = true });

したがって、現在行っていることを実行できるはずです。また、コンソールをリダイレクトしていないかのようにすべてを標準にエコーしたい場合は、Console.OpenStandardOutputメソッドを使用して自分で開いたストリームを使用して独自のライターを作成できます。そのWin32Nativeコードで使用されているのは内部であるため、アクセスすることはできませんが、を使用して、使用しConsole.OutputEncodingているエンコーディングを取得できます。

Console.OutSetOutを呼び出す直前に、プロパティを使用して標準出力のTextWriterを取得してハングアップすることもできます。次に、それを使用して標準出力にエコーすることができます。

于 2012-06-06T16:34:54.093 に答える