Console.WriteLine đi đâu trong ASP.NET?


313

Trong một ứng dụng J2EE (giống như một ứng dụng đang chạy trong WebSphere), khi tôi sử dụng System.out.println(), văn bản của tôi chuyển sang tiêu chuẩn, được ánh xạ tới một tệp bởi bảng điều khiển quản trị WebSphere.

Trong một ứng dụng ASP.NET (như một ứng dụng đang chạy trong IIS), đầu ra của Console.WriteLine()đi đâu? Quá trình IIS phải có stdin, stdout và stderr; nhưng stdout được ánh xạ tới phiên bản Windows của / dev / null hay tôi thiếu một khái niệm quan trọng ở đây?

Tôi không hỏi tôi có nên đăng nhập ở đó không (tôi sử dụng log4net), nhưng đầu ra đi đâu? Thông tin tốt nhất của tôi đến từ cuộc thảo luận này nơi họ nói Console.SetOut()có thể thay đổi TextWriter, nhưng nó vẫn không trả lời câu hỏi về giá trị ban đầu của Bảng điều khiển là gì, hoặc làm thế nào để đặt nó trong cấu hình / bên ngoài mã thời gian chạy.


Nó thực sự sẽ đi đến STDOUT của quy trình ASP.NET Worker. Nơi mà nó được chỉ vào, tôi không chắc chắn.
FlySwat

2
Đó là câu hỏi - STDOUT đi đâu?
Kevin Hakanson

35
rõ ràng không ai biết, nhưng mọi người đều sử dụng nó trong các ví dụ của họ. wtf
Jason

nếu bạn đang tìm kiếm mục đích gỡ lỗi, tôi sẽ giới thiệu câu trả lời @Greg Bernhardt bên dưới.
Ram

1
@KevinHakanson FWIW tất cả những năm sau đó, tiêu chuẩn cho bất kỳ quy trình nào được chọn bởi cha mẹ của nó, quá trình bắt đầu nó. Trong trường hợp này, cha mẹ sẽ là IIS. Điều này có thể chỉ cho bạn đi đúng hướng .
jpaugh

Câu trả lời:


197

Nếu bạn nhìn vào Consolelớp trong .NET Reflector , bạn sẽ thấy rằng nếu một tiến trình không có bảng điều khiển liên quan Console.OutConsole.Errorđược hỗ trợ bởi Stream.Null(được bao bọc bên trong a TextWriter), thì đó là một triển khai giả Streamvề cơ bản bỏ qua tất cả đầu vào và không cho đầu ra.

Vì vậy, nó tương đương về mặt khái niệm /dev/null, nhưng việc triển khai được sắp xếp hợp lý hơn: không có I / O thực tế diễn ra với thiết bị null.

Ngoài ra, ngoài việc gọi SetOut, không có cách nào để cấu hình mặc định.


18
Sử dụng System.Diagnostics.Debug.WriteLine () nếu bạn thực sự muốn ghi gì đó vào cửa sổ đầu ra, bạn có thể xem khi gỡ lỗi.
Ε é И

743

Nếu bạn sử dụng System.Diagnostics.Debug.WriteLine(...)thay vì Console.WriteLine(), thì bạn có thể thấy kết quả trong cửa sổ đầu ra của Visual Studio.


45
Tôi đã hỏi câu hỏi tương tự như Kevin, nhưng đây là câu trả lời tôi sẽ tìm kiếm.
Zasz

11
Thêm một gợi ý nhỏ; nếu bạn đang in một chuỗi được định dạng, hãy sử dụng Debug.Print thay vì Debug.WriteLine để tránh xung đột đối số (xem social.msdn.microsoft.com/Forums/ar/Vse े vcs / thread / lau ).
Nicholas Riley

12
Lưu ý rằng trình gỡ lỗi cần phải được đính kèm để các thông báo được hiển thị trong cửa sổ đầu ra.
Cosmin

4
Điều này không hoạt động cho IIS cục bộ hoặc một cái gì đó? Tôi dường như không thể viết ra đầu ra cho cuộc sống của mình, mặc dù thực tế là tôi đang bắt đầu điều này với F5 (vì vậy trình gỡ lỗi được đính kèm). Tôi biết mã của tôi đang được thực thi bởi vì tôi có thể ghi vào một tệp tốt.
Kat

@Cosmin Chính xác .exe mà tôi nên đính kèm trong VS?
Grace

26

Tôi đã tìm thấy câu hỏi này bằng cách thay đổi đầu ra Nhật ký của DataContext thành cửa sổ đầu ra. Vì vậy, với bất kỳ ai khác đang cố gắng làm điều tương tự, những gì tôi đã làm là tạo ra điều này:

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; }
   }
}

Sau đó: dc.Log = new DebugTextWriter () và tôi có thể thấy tất cả các truy vấn trong cửa sổ đầu ra (dc là DataContext).

Hãy xem cái này để biết thêm thông tin: http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-memory-or-multipl-writers


Tại sao không chỉ sử dụng một trình bao bọc tĩnh, cho rằng bạn đang gói các phương thức tĩnh hoàn toàn? Tại sao phải kéo dài TextWriter?
Kat

1
Bạn cũng có thể sử dụng dc.Log = s => Debug.WriteLine(s);.
Rudey

1
Application_Start: System.Console.SetOut (DebugTextWriter ()) mới;
Stefan Steiger

Thậm chí tốt hơn, Console.SetOut (DebugTextWriter ()) mới;
Alde

18

Nếu bạn đang sử dụng IIS Express và khởi chạy nó thông qua một dấu nhắc lệnh, nó sẽ để cửa sổ DOS mở và bạn sẽ thấy các Console.Writecâu lệnh ở đó.

Vì vậy, ví dụ, mở một cửa sổ lệnh và gõ:

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

Điều này giả sử bạn có một thư mục trang web tại C: \ Project \ Website1. Nó sẽ khởi động IIS Express và phục vụ các trang trong thư mục trang web của bạn. Nó sẽ để các cửa sổ lệnh mở và bạn sẽ thấy thông tin đầu ra ở đó. Giả sử bạn có một tệp ở đó, default.aspx, với mã này trong đó:

<%@ 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>

Sắp xếp trình duyệt của bạn và các cửa sổ lệnh để bạn có thể nhìn thấy cả hai trên màn hình. Bây giờ gõ vào trình duyệt của bạn : http://localhost:1655/. Bạn sẽ thấy Xin chào! trên trang web, nhưng trong cửa sổ lệnh, bạn sẽ thấy một cái gì đó như

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

Tôi đã làm cho nó đơn giản bằng cách có mã trong một khối mã trong đánh dấu, nhưng bất kỳ câu lệnh giao diện điều khiển nào trong mã phía sau hoặc bất kỳ nơi nào khác trong mã của bạn cũng sẽ hiển thị ở đây.


+1 Tôi luôn sử dụng IIS Express trong khi phát triển vì lý do này. Đầu ra giao diện điều khiển là vô giá, được sử dụng ở phía sau như giao diện điều khiển javascript ở giao diện người dùng. Tiết kiệm hàng đống thời gian gỡ lỗi, trái ngược với việc sử dụng nhật ký máy chủ dựa trên tệp. Bạn không phải ghi đè xử lý ngoại lệ "thân thiện" - giữ trang trình duyệt "oops" đẹp và chỉ cần xuất ngoại lệ ra bàn điều khiển, dễ thấy.
thành

9

System.Diagnostics.Debug.WriteLine(...);đưa nó vào Cửa sổ ngay lập tức trong Visual Studio 2008.

Chuyển đến menu Gỡ lỗi -> Windows -> Ngay lập tức :

Nhập mô tả hình ảnh ở đây


Trong Visual Studio 2012 của tôi, tôi đã làm theo những gì bạn nói nhưng chuỗi xuất hiện Outputchỉ bên cạnh Lời Immediate Windowcảm ơn!
WTFZane

6

Đơn giản là không có giao diện điều khiển nghe theo mặc định. Chạy trong chế độ gỡ lỗi có một bảng điều khiển được đính kèm, nhưng trong môi trường sản xuất, như bạn nghi ngờ, thông báo sẽ không đi đến đâu vì không có gì nghe.


5

Trừ khi bạn ở trong một ứng dụng bảng điều khiển nghiêm ngặt, tôi sẽ không sử dụng nó, bởi vì bạn thực sự không thể nhìn thấy nó. Tôi sẽ sử dụng Trace.WriteLine () cho thông tin loại gỡ lỗi có thể bật và tắt trong sản xuất.


Đúng, đây là một nơi tốt để bắt đầu: msdn.microsoft.com/en-us/library/x5952w0c.aspx
Zhaph - Ben Duguid

3

Đối TraceContexttượng trong ASP.NET ghi vào DefaultTraceListenerđầu ra nào cho đầu ra tiêu chuẩn của tiến trình máy chủ . Thay vì sử dụng Console.Write(), nếu bạn sử dụng Trace.Write, đầu ra sẽ chuyển đến đầu ra tiêu chuẩn của quy trình.

Bạn có thể sử dụng System.Diagnostics.Processđối tượng để có được quy trình ASP.NET cho trang web của mình và theo dõi đầu ra tiêu chuẩn bằng cách sử dụng OutputDataRecievedsự kiện.


1

nếu bạn tình cờ sử dụng NLog trong dự án ASP.net của mình, bạn có thể thêm mục tiêu Trình gỡ lỗi :

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

và ghi nhật ký vào mục tiêu này cho các cấp độ bạn muốn:

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

bây giờ bạn có đầu ra giao diện điều khiển giống như Jetty trong cửa sổ "Đầu ra" của VS và đảm bảo rằng bạn đang chạy ở Chế độ gỡ lỗi (F5).


0

Điều này gây nhầm lẫn cho mọi người khi nói đến IISExpress. Không có gì để đọc tin nhắn console. Vì vậy, ví dụ, trong các ứng dụng ASPCORE MVC, nó cấu hình bằng appsinstall.json, không có gì nếu bạn đang sử dụng IISExpress.

Ngay bây giờ bạn chỉ có thể thêm loggerFactory.AddDebug (LogLevel.Debug); trong phần Cấu hình của bạn và ít nhất nó sẽ hiển thị cho bạn nhật ký của bạn trong cửa sổ Gỡ lỗi.

Tin tốt CORE 2.0 tất cả sẽ được thay đổi: https://github.com/aspnet/Announcements/issues/255



-3

Trong một ứng dụng ASP.NET, tôi nghĩ rằng nó đi đến cửa sổ Đầu ra hoặc Bảng điều khiển hiển thị trong quá trình gỡ lỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.