2008-09-26 660 views
245

在一個J2EE應用程序(如WebSphere中運行的應用程序)中,當我使用System.out.println()時,我的文本轉爲標準輸出,它由WebSphere管理控制檯映射到文件。Console.WriteLine在ASP.NET中去哪裏?

在ASP.NET應用程序(如IIS中運行的應用程序)中,Console.WriteLine()的輸出結果在哪裏? IIS進程必須有一個stdin,stdout和stderr;但stdout映射到/ dev/null的Windows版本還是我在這裏丟失了一個關鍵概念?

我是不要求如果我應該在那裏登錄(我使用log4net),但輸出到哪裏去?我最好的信息來自這個discussion他們說Console.SetOut()可以更改TextWriter,但它仍然沒有回答控制檯的初始值是什麼,或者如何在運行時代碼的config/outside中設置它的問題。

+25

顯然沒有人知道,但每個人都使用它在自己的例子。 wtf – Jason 2009-08-25 20:59:11

+0

如果您正在尋找調試目的,我會參考下面的@Greg Bernhardt回覆。 – Rama 2015-10-09 06:44:57

+0

它實際上會轉到ASP.NET工作進程的標準輸出。在那裏指出,我不確定。 – FlySwat 2008-09-26 03:50:02

回答

155

如果你看一下在.NET ReflectorConsole類,你會發現,如果一個進程沒有相關的控制檯,Console.OutConsole.ErrorStream.Null(包裹內TextWriter)的支持,這是一個虛擬的實施Stream基本上忽略了所有的輸入,並沒有輸出。

所以它在概念上等同於/dev/null,但實現更加簡化:使用空設備不會發生實際的I/O。

此外,除了呼叫SetOut之外,沒有辦法配置默認值。

-1

在ASP.NET應用程序中,我認爲它轉到了Output或Console窗口,該窗口在調試過程中可見。

3

除非您處於嚴格的控制檯應用程序中,否則我不會使用它,因爲您無法真正看到它。我會使用Trace.WriteLine()來調試可以在生產中打開和關閉的信息。

+0

是的,這裏是一個很好的開始:http://msdn.microsoft.com/en-us/library/x5952w0c.aspx – 2009-05-18 21:32:09

6

默認情況下,根本沒有控制檯監聽。在調試模式下運行時,會連接一個控制檯,但在生產環境中,您可能會懷疑這個消息,因爲沒有任何信息正在收聽,所以消息不會出現在任何地方。

581

如果您使用的System.Diagnostics.Debug.WriteLine(...)代替Console.WriteLine(),然後就可以看到在Visual Studio中的輸出窗口中的結果。

+33

我會問同樣的問題,凱文,但這是我會的答案一直在尋找。 – Zasz 2011-06-11 17:04:09

23

我已經通過嘗試將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; } 
    } 
} 

Annd後:dc.Log =新DebugTextWriter(),我可以看到在輸出窗口中的所有查詢( dc是DataContext)。

看一看本作的詳細信息:http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-memory-or-multiple-writers

3

TraceContext對象在ASP.NET寫入到輸出到主機進程standard outputDefaultTraceListener。如果使用Trace.Write,則輸出將轉到過程的標準輸出,而不是使用Console.Write()

您可以使用System.Diagnostics.Process對象來獲取ASP。NET過程,並使用OutputDataRecieved事件監視標準輸出。

3

System.Diagnostics.Debug.WriteLine(...);得到它到立即窗口在Visual Studio中  2008年 

進入菜單調試 - >的Windows - >立即

Enter image description here

12

如果您正在使用IIS Express並通過命令提示符啓動它,它將打開DOS窗口,您將在那裏看到Console.Write語句。

因此,例如得到一個命令窗口打開並鍵入:

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

這裏假設你有位於C網站目錄:\項目\ WEBSITE1。它將啓動IIS Express並提供網站目錄中的頁面。它將使命令窗口保持打開狀態,您將在那裏看到輸出信息。比方說,你有一個文件存在,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/。你會看到你好!在網頁上,但在命令窗口中,你會看到類似

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

我做了簡單的通過具有在標記代碼塊中的代碼,但在你的code-behind或其他任何地方的任何控制檯語句在你的代碼也會在這裏顯示。

1

如果你看看調試窗口,你會看到console.writelines。

0

這對每個人來說都是令人困惑的,當它來到IISExpress。沒有什麼要讀取控制檯消息。例如,在ASPCORE MVC應用程序中,它使用appsettings.json進行配置,如果您使用的是IISExpress,則它不執行任何操作。

現在,您可以添加loggerFactory.AddDebug(LogLevel.Debug);在你的配置部分,它至少會在調試輸出窗口中顯示你的日誌。

好消息CORE 2.0這都將發生變化:https://github.com/aspnet/Announcements/issues/255