18

リモートの顧客システムにデプロイされた C# サービスがあります。アプリケーションは、かなりの量の「診断」情報をコンソール (つまり、Console.WriteLine()) に書き込みます。サービスは「本来あるべきことをしている」わけではありません。サービスからのコンソール出力を別のアプリケーションでキャプチャするにはどうすればよいでしょうか?

お客様の場所でアプリケーションをロードできる WinForm バージョン。残念ながら、正しく機能します。

アップデート:

サービスを変更することはできますが、現時点では大幅な変更は避けたいと考えています。

MSMQ にもログを記録していますが、これは「重要な」イベントのみです。このサービスは、通常の操作で MSMQ と対話します。または、少なくとも、そうすべきです。WinForm バージョンが MSMQ からアイテムをプルしている場合、サービスはアイテムをプルしていないようです。そのため、コンソールに送信されるメッセージを書き込むことは問題になる可能性があります。

4

7 に答える 7

30

サービスコードを変更できますか? その場合、代わりに Console.SetOut を使用してファイルに書き込むことが、最も明白な最初の呼び出しポートになります。次に、次のリリース用の適切なログ ライブラリを使用するように変更します :)

于 2008-10-14T15:21:10.027 に答える
12

一般に、診断情報をアプリケーション コードからコンソール、イベント ログ、MSMQ などに直接書き込むことは避けてください。代わりに、ログ API を呼び出し、構成を使用して、必要な場所に出力をリダイレクトします。

たとえば、すべての Console.WriteLine を Trace.WriteLine (*) に置き換えることができます。次に、アプリケーション構成ファイルを変更して、出力をコンソール、ファイル、または他の場所にリダイレクトできます。たとえば、コンソールに出力するには、次のような ConsoleTraceListener を使用します。

<configuration>
  <system.diagnostics>
    <trace autoflush="false" indentsize="4">
      <listeners>
        <add name="configConsoleListener"
             type="System.Diagnostics.ConsoleTraceListener" />
      </listeners>
    </trace>
  </system.diagnostics>
 </configuration>

デバッグ中は、コンソールに出力が表示されます。お客様のサイトでは、トレース出力をファイルやイベント ログなどにリダイレクトするように構成します。

さらに良いことに、System.Diagnostics.Trace よりも多くのオプションを提供するサード パーティのログ フレームワーク (私は Log4Net をお勧めします) を使用します。

(*) Trace.Write/Trace.WriteLine は Debug.Write/Debug.WriteLine と同じですが、後者は DEBUG シンボルが定義されている場合にのみコンパイルされます。そのため、リリース ビルドで出力を利用できるようにする場合は、Trace to Debug を選択してください。

于 2008-10-14T16:52:13.227 に答える
5

たくさんのオプションがあります。コンソール出力をファイルにリダイレクトすることと、前述の適切なログ ライブラリを使用することは、2 つの良い方法です。中間のオプションは次のとおりです。イベント ログに書き込みます。

EventLog log;
string logsource = "MyService";

// execute once per invocation
if (!System.Diagnostics.EventLog.SourceExists(logsource))
{
    System.Diagnostics.EventLog.CreateEventSource(
        logsource, "Application");
}
log = new EventLog();
log.Source = logsource;
log.Log = "Application";

// replace console logging with this
log.WriteEntry(message, EventLogEntryType.Information);

次に、アプリケーション イベント ログ ([管理ツール] -> [イベント ビューア]) でソース = "MyService" のエントリを探します。

于 2008-10-14T16:07:22.833 に答える
3

Window Service からは Console.WriteLine をまったく使用しません。おそらく、これらのエラーをログ ファイルに記録する必要があります。

複数のアプリケーションがログを消費できるようにするもう 1 つの方法は、ログ メッセージを MSMQ キューにポストすることです。

于 2008-10-14T15:26:19.970 に答える
3

debug.writeline を使用し、sysinternals debugview を使用しますか?

于 2008-10-14T15:28:59.590 に答える
1

これは、Windows 7 で実行されているサービスのコンソール出力をどのように表示したかです。これは、サービスのソース コードを変更してファイルにログを記録することが絶対にできない場合に役立つ可能性があります。

  1. services.msc を実行し、サービスのプロパティを編集します。[ログオン] タブで、[デスクトップとの対話をサービスに許可する] にチェックを入れます。

  2. レジストリ エディターを使用して、サービスの ImagePath を変更します。HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\ [サービス名] に移動し、ImagePath を編集します。ImagePathcmd.exe /c文字列の先頭に追加します。したがって、元の ImagePath がc:\myService\myservice.exe新しい ImagePath である場合は、 cmd.exe /c c:\myService\myservice.exe.

  3. サービスを開始します。「Interactive Services Detection」というタイトルのポップアップ ウィンドウが表示されます。「メッセージを見る」を選択。画面のコンテキストが切り替わり、コンソール ウィンドウが表示されます。終了したら、「今すぐ戻る」ボタンをクリックします。

  4. デバッグが終了したら、ImagePath を元の値に戻します。次に、サービスのプロパティで [デスクトップとの対話をサービスに許可する] チェックボックスをオフにして、サービスを再起動します。

警告: 私はこれを 1 つのサービスでのみ実行しましたが、うまくいきました。それがどのサービスでも機能するかどうか、または予期しない結果を引き起こすかどうかはわかりません。そのため、これは非実稼働環境でのみ行うことを強くお勧めします。

于 2015-11-19T16:45:48.453 に答える
1

コンソール出力をリッチ テキスト ボックスにバインドするこの投稿を MSDN で見つけましたが、非常に迅速かつ簡単に機能しました。

これは WriteLine をオーバーライドし、拡張して他のメソッドをオーバーライドできます。

于 2009-07-08T09:44:13.577 に答える