2

さまざまなリソースのステータスを適切にフォーマットされた方法で書き出すシンプルなコンソールアプリがあります。

このアプリは、いくつかのサードパーティコンポーネントを使用して場所に接続しています。

残念ながら、これらのコンポーネントは多くのConsole.Writes(またはある種のロギング)を実行しますが、これらはすべて私のメッセージと絡み合ってしまいます。

コンソール出力をリダイレクトしようとしましたが(自分以外のメッセージをフィルタリングできることを期待して)、それは自分のメッセージでのみ機能するようです。

var sb = new StringBuilder();
TextWriter tw = new StringWriter(sb);
Console.SetOut(tw);

したがって、これはコンソール書き込みのリダイレクトで機能しますが、私が行ったものでのみ機能します。サードパーティコンポーネントからの出力はまだ画面にストリーミングされています。それを抑制する他の方法はありますか?

4

3 に答える 3

1

サードパーティコンポーネントの出力をリダイレクトできない理由は、プロセスではなく、プロセスでリダイレクトを呼び出しているためです。これを行うには、プロセスをループし、コンソールに書き込んでいるプロセスを見つけて、それらの出力をリダイレクトします。

 using System.Diagnostics;

 Process[] processlist = Process.GetProcesses();


 foreach(Process theprocess in processlist){
       // you'll actually need to use something like the process name or id here.
       if (theprocess == MyThirdPartyComponentsProcess)
       {
             theprocess.StartInfo.UseShellExecute = false;
             theprocess.StartInfo.RedirectStandardOutput = true; 
        }
  }

この作業の管理者として実行する必要があります。

于 2012-11-13T18:30:46.463 に答える
0

私は1つのかなりハッキーな方法を考えました:

  • Console.Out「本物の」ライターで再利用できるように、既存のものをキャプチャします
  • TextWriter独自の実装を作成します。
  • ...書き込みを求められたら、呼び出し元のコードがアセンブリにあるかどうかを確認します。見るAssembly.GetCallingAssembly

インライン化の問題がない限り、コンテキストを確認し、不要な出力をドロップできるはずです。おそらく、Console.Out.WriteLine代わりに直接電話するConsole.WriteLine必要があります。そうしないと、発信者がConsoleクラスになります。

より良い解決策は、log4netまたは同様のものを使用するようにコードを変更することです。これにより、コンソールではなく、より構成可能な方法で出力を取得できます。(インタラクティブ出力の場合は、上記のようなものが唯一の方法かもしれません...)

于 2012-11-13T18:34:06.087 に答える
0

これらを抑制するための合理的な迅速な方法がないように思われるので、私はプランBを採用しました。これは、メッセージを最後まで延期することです。このようにして、すべてのロギングが通過し、興味のあるすべての情報を書き出すよりも。

私はそれを成功/警告/エラーのメソッドに分解しました

    public static void WriteError(string message, params string[] args) {
        writerTasks.Add(() => {
            var c = Console.ForegroundColor;
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(message, args);
            Console.ForegroundColor = c;
        });
    }

実行の最後に、このメソッドを呼び出してフラッシュします。

    private static void WriteResults() {
        foreach (var t in writerTasks)
            t();
    }

各アクションに含まれるメッセージの種類に応じてテキストの色を変更するため、このようにします。

私の場合、これはうまく機能します。情報が上にスクロールしてすべてのログが非表示になるためです。これは実際にも有益です。メイン出力間で分散させたくありませんでした。

于 2012-11-13T22:07:53.823 に答える