web-dev-qa-db-ja.com

Console.WriteLineはASP.NETのどこにありますか?

J2EEアプリケーション(WebSphereで実行されているアプリケーションなど)では、System.out.println()を使用すると、テキストが標準出力に出力されます。これは、WebSphere管理コンソールによってファイルにマップされます。

ASP.NETアプリケーション(IISで実行されているアプリケーションなど)では、Console.WriteLine()の出力はどこに移動しますか? IISプロセスには、標準入力、標準出力、および標準エラー出力が必要です。しかし、標準出力はWindows版の/ dev/nullにマッピングされているのでしょうか。

私は私は私はそこにログを記録する必要があるかどうかを尋ねない(私はlog4netを使用します)が、出力はどこに行くのですか? Console.SetOut()TextWriterを変えることができると言っている ディスカッション から私の最も良い情報が得られました、しかしそれはそれでもコンソールの初期値が何か、またはどのようにするかに関する質問に答えませんでしたランタイムコードのconfig/outsideに設定してください。

289
Kevin Hakanson

。NET ReflectorConsoleクラスを見ると、プロセスに関連付けられたコンソールがない場合、Console.OutConsole.ErrorStream.NullTextWriterで囲まれています)に裏打ちされています。 Streamのダミー実装で、基本的にすべての入力を無視し、出力はしません。

したがって、概念的には/dev/nullと同等ですが、実装はより合理化されています。ヌルデバイスでは実際のI/Oは行われません。

また、SetOutを呼び出す以外に、デフォルトを設定する方法はありません。

186
Ruben

System.Diagnostics.Debug.WriteLine(...)の代わりにConsole.WriteLine()を使用すると、Visual StudioのOutputウィンドウに結果が表示されます。

687
Greg Bernhardt

私はこの質問をDataContextのLog出力を出力ウィンドウに変更しようとすることによって見つけました。だから同じことをやろうとしている誰かに、私がしたのはこれを作成することでした:

class DebugTextWriter : System.IO.TextWriter {
   public override void Write(char[] buffer, int index, int count) {
       System.Diagnostics.Debug.Write(new String(buffer, index, count));
   }

   public override void Write(string value) {
       System.Diagnostics.Debug.Write(value);
   }

   public override Encoding Encoding {
       get { return System.Text.Encoding.Default; }
   }
}

その後に、dc.Log = new DebugTextWriter()を実行すると、すべてのクエリが出力ウィンドウに表示されます(dcはDataContextです)。

詳細はこちらをご覧ください。 http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-メモリライターまたはマルチライター

24
Artur Carvalho

IIS Expressを使用してコマンドプロンプトで起動すると、 DOS ウィンドウは開いたままになり、そこにConsole.Writeステートメントが表示されます。

たとえば、コマンドウィンドウを開いて次のように入力します。

"C:\Program Files (x86)\IIS Express\iisexpress" /path:C:\Projects\Website1 /port:1655

これは、C:\ Projects\Website1にWebサイトディレクトリがあると仮定しています。 IIS Expressが起動し、Webサイトのディレクトリにあるページが表示されます。コマンドウィンドウは開いたままになり、そこに出力情報が表示されます。このコードが入ったファイルdefault.aspxがあるとしましょう。

<%@ Page Language="C#" %>
<html>
<body>
    <form id="form1" runat="server">
    Hello!

    <% for(int i = 0; i < 6; i++) %>
       <% { Console.WriteLine(i.ToString()); }%>

    </form>
</body>
</html>

ブラウザとコマンドウィンドウの両方を画面に表示できるように配置します。ブラウザにhttp://localhost:1655/と入力してください。こんにちは! Webページでは、しかしコマンドウィンドウでは、のようなものが表示されます

Request started: "GET" http://localhost:1655/
0
1
2
3
4
5
Request ended: http://localhost:1655/default.aspx with HTTP status 200.0

マークアップのコードブロックにコードを入れることでコードを単純にしましたが、 分離コード またはコード内の他の場所にあるコンソールステートメントもここに表示されます。

17
Chris

デフォルトでは、コンソールは待機しません。デバッグモードで実行するとコンソールが接続されますが、本番環境では疑わしいことですが、メッセージは何も聞こえないのでどこにも行きません。

6
Craig Tyler

System.Diagnostics.Debug.WriteLine(...);は、Visual Studio 2008のイミディエイトウィンドウに入れます。

メニューに移動しますデバッグ - > Windows - > 即時

Enter image description here

6
Nik

厳密なコンソールアプリケーションを使用していない限り、実際には表示されないため、使用しません。実運用でオン/オフできるデバッグタイプの情報にはTrace.WriteLine()を使用します。

4
Charles Graham

ASP.NETのTraceContextオブジェクトは、ホストプロセスに出力するDefaultTraceListenerに書き込みます 標準出力Trace.Writeを使用する場合、Console.Write()を使用するのではなく、出力はプロセスの標準出力に行きます。

System.Diagnostics.Processオブジェクトを使用して、サイトのASP.NETプロセスを取得し、OutputDataRecievedイベントを使用して標準出力を監視できます。

3
Brian Griffin

たまたまASP.netプロジェクトでNLogを使用している場合は、 Debugger target を追加できます。

<targets>
    <target name="debugger" xsi:type="Debugger"
            layout="${date:format=HH\:mm\:ss}|${pad:padding=5:inner=${level:uppercase=true}}|${message} "/>

そして、あなたが望むレベルのログをこのターゲットに書き込みます。

<rules>
    <logger name="*" minlevel="Trace" writeTo="debugger" />

これで、VSの[出力]ウィンドウにJettyとまったく同じコンソール出力が表示されます。デバッグモード(F5)で実行していることを確認してください。

1
mickey

IISExpressになると、これは誰にとっても混乱を招きます。コンソールメッセージを読むことは何もありません。そのため、例えばASPCORE MVCアプリケーションでは、appsettings.jsonを使用して構成しますが、IISExpressを使用している場合は何もしません。

現時点では、loggerFactory.AddDebug(LogLevel.Debug)を追加するだけです。あなたのConfigureセクションで、少なくともDebug Outputウィンドウにあなたのログを表示するでしょう。

良いニュースCORE 2.0これはすべて変化するでしょう: https://github.com/aspnet/Announcements/issues/255

0
Chris Go