サービスC#からコンソール出力をキャプチャする方法は?
質問
リモートの顧客システムに展開される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で実行されているサービスのコンソール出力を表示する方法を次に示します。これは、ファイルのログに記録するためにサービスのソースコードを絶対に変更できない場合に役立ちます。
-
services.mscを実行し、サービスのプロパティを編集します。 [ログオン]で、タブで、[デスクトップとの対話をサービスに許可する]をチェックします。
-
レジストリエディターを使用してサービスのImagePathを変更します。HKEY_LOCAL_MACHINE\ SYSTEM \ ControlSet001 \ services \ [サービス名]に移動して、ImagePathを編集します。 ImagePath文字列の先頭に
cmd.exe / c
を追加します。したがって、元のImagePathがc:\ myService \ myservice.exe
の場合、新しいImagePathはcmd.exe /cc:\myService\myservice.exe
になります。 -
サービスを開始します。 「インタラクティブサービスの検出」というタイトルのポップアップウィンドウが表示されます。 [メッセージを表示]を選択します。画面のコンテキストが切り替わり、コンソールウィンドウが表示されます。終了したら、[今すぐ戻る]をクリックします。ボタン。
-
デバッグが終了したら、ImagePathを変更して元の値に戻します。次に、「デスクトップとの対話をサービスに許可する」のチェックを外します。サービスプロパティのチェックボックスをオンにして、サービスを再起動します。
警告:1つのサービスでこれを行っただけで、うまくいきました。サービスで機能するかどうか、または予期しない結果が発生するかどうかはわかりませんので、非実稼働環境でのみこれを行うことを強くお勧めします。