サービスC#からコンソール出力をキャプチャする方法は?

StackOverflow https://stackoverflow.com/questions/201616

  •  03-07-2019
  •  | 
  •  

質問

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

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

更新:

サービスの変更を変更することはできますが、現時点では大きな変更を行わないことを希望します。

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

役に立ちましたか?

解決

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

他のヒント

一般に、コンソール、イベントログ、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シンボルが定義されている場合にのみコンパイルされます。そのため、リリースビルドで出力を使用できるようにする場合は、トレースよりデバッグを優先します。

多数のオプションがあります。前述のようにコンソール出力をファイルにリダイレクトし、適切なロギングライブラリを使用することは、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);

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

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

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

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

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

WriteLineをオーバーライドし、他のメソッドをオーバーライドするように展開できます。

Windows 7で実行されているサービスのコンソール出力を表示する方法を次に示します。これは、ファイルのログに記録するためにサービスのソースコードを絶対に変更できない場合に役立ちます。

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

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top