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


313

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

ASP.NETアプリケーション(IISで実行されているアプリケーションなど)では、出力はConsole.WriteLine()どこに行きますか?IISプロセスには、stdin、stdout、およびstderrが必要です。stdoutはWindows版の/ dev / nullにマッピングされていますか、またはここに重要な概念がありませんか?

そこにログを記録する必要があるかどうかは尋ねいません(私はlog4netを使用しています)が、出力はどこに行きますか?私の最高の情報は、彼らがを変更できると言うこの議論から来ましたが、それでもコンソールの初期値は何か、またはランタイムコードのconfig / outsideでそれを設定する方法についての質問には答えませんでした。Console.SetOut()TextWriter


ASP.NETワーカープロセスのSTDOUTに実際行きます。それが指摘されている場所は、よくわかりません。
FlySwat 2008

2
それが問題です-STDOUTはどこに行きますか?
ケビンハカンソン09

35
誰も知らないようですが、誰もが例でそれを使用しています。wtf
ジェイソン

デバッグの目的で探している場合は、@ Greg Bernhardtの返信を参照してください。
Ram

1
@KevinHakanson FWIW数年後、すべてのプロセスのstdoutは、その親、つまりプロセスを開始したプロセスによって選択されます。この場合、親はIISです。これは正しい方向にあなたを向けるかもしれません
jpaugh

回答:


197

あなたが見ればConsole、クラス.NETリフレクター、あなたはプロセスは、関連するコンソールを持っていない、場合ことを見つけるConsole.OutConsole.Errorが付いていますStream.Null(内にラップTextWriterのダミー実装である、)Streamその基本的にすべての入力を無視し、出力はありません。

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

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


18
デバッグ時に表示できる出力ウィンドウに実際に何かを書き込む場合は、System.Diagnostics.Debug.WriteLine()を使用します。
ΕГИІИО

743

System.Diagnostics.Debug.WriteLine(...)代わりにを使用するとConsole.WriteLine()、Visual Studioの[ 出力]ウィンドウで結果を確認できます。


45
私はケビンと同じ質問をしたでしょうが、これが私が探していた答えです。
Zasz

11
もう1つのヒント。書式設定された文字列を印刷する場合は、Debug.WriteLineではなくDebug.Printを使用して、引数の競合を回避します(social.msdn.microsoft.com/Forums/ar/Vsexpressvcs/thread/…を参照)。
Nicholas Riley

12
メッセージを出力ウィンドウに表示するには、デバッガをアタッチする必要があることに注意してください。
Cosmin 2013

4
これはローカルIISなどでは機能しませんか?これをF5で開始している(デバッガーが接続されている)にもかかわらず、私が一生出力を書き込むことができないようです。ファイルに問題なく書き込むことができるので、コードが実行されていることがわかります。
2015年

@Cosmin VSでアタッチする必要がある正確な.exeは何ですか?
猶予

26

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

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-memory-or-multiple-writers


完全に静的なメソッドをラップしているのに、なぜ静的なラッパーを使用しないのですか?なぜわざわざ拡張するのTextWriter
Kat、2015年

1
も使用できますdc.Log = s => Debug.WriteLine(s);
Rudey、2016

1
Application_Start:System.Console.SetOut(new DebugTextWriter());
Stefan Steiger 2016年

さらに良いことに、Console.SetOut(new DebugTextWriter());
Alde

18

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

マークアップのコードブロックにコードを含めることで簡単にしましたが、コードビハインドまたはコードの他の場所にあるコンソールステートメントもここに表示されます。


+1このため、開発中は常にIIS Expressを使用しています。コンソール出力は非常に貴重であり、フロントエンドのJavaScriptコンソールのようにバックエンドで使用されます。ファイルベースのサーバーログを使用するのではなく、デバッグ時間を大幅に節約できます。「友好的な」例外処理をオーバーライドする必要はありません。見栄えのよい「oops」ブラウザページを維持し、例外をコンソールに出力するだけです。
原材料

9

System.Diagnostics.Debug.WriteLine(...);それを取得するイミディエイトウィンドウのVisual Studio 2008で。

メニューに移動しますデバッグ -> ウィンドウ -> 即時

ここに画像の説明を入力してください


私のVisual Studio 2012では、私はあなたが言ったことをフォローしましたが、文字列OutputImmediate Window感謝のほかに表示されました!
WTFZane 2017年

6

デフォルトでは単にリッスンしているコンソールはありません。デバッグモードで実行するとコンソールが接続されますが、本番環境ではご想像どおり、何も待機していないためメッセージがどこにも届きません。



3

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

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


1

ASP.netプロジェクトでたまたまNLogを使用している場合は、デバッガーターゲットを追加できます。

<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)で実行していることを確認できます。


0

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

現時点では、loggerFactory.AddDebug(LogLevel.Debug);を追加するだけです。構成セクションで、少なくともデバッグ出力ウィンドウにログを表示します。

良いニュースCORE 2.0これはすべて変更されます:https : //github.com/aspnet/Announcements/issues/255



-3

ASP.NETアプリケーションでは、デバッグ中に表示される出力ウィンドウまたはコンソールウィンドウに移動すると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.