Di mana pergi Console.WriteLine di ASP.NET?

313

Dalam aplikasi J2EE (seperti yang berjalan di WebSphere), ketika saya menggunakan System.out.println(), teks saya pergi ke standar, yang dipetakan ke file oleh konsol admin WebSphere.

Dalam aplikasi ASP.NET (seperti yang berjalan di IIS), di mana outputnya Console.WriteLine()? Proses IIS harus memiliki stdin, stdout dan stderr; tetapi apakah stdout dipetakan ke versi Windows dari / dev / null atau apakah saya kehilangan konsep kunci di sini?

Saya tidak bertanya apakah saya harus masuk ke sana (saya menggunakan log4net), tetapi ke mana hasilnya? Info terbaik saya berasal dari diskusi ini di mana mereka mengatakan Console.SetOut()dapat mengubah TextWriter, tetapi masih tidak menjawab pertanyaan tentang apa nilai awal dari Konsol, atau bagaimana mengaturnya di config / di luar kode runtime.

Kevin Hakanson
sumber
Itu benar-benar akan pergi ke STDOUT dari proses Pekerja ASP.NET. Ke mana itu ditunjukkan, saya tidak yakin.
FlySwat
2
Itulah pertanyaannya - kemana STDOUT pergi?
Kevin Hakanson
35
rupanya tidak ada yang tahu, tetapi semua orang menggunakannya dalam contoh mereka. wtf
Jason
jika Anda mencari tujuan debug saya akan merujuk balasan @Greg Bernhardt di bawah ini.
Ram
1
@KevinHakanson FWIW bertahun-tahun kemudian, stdout untuk setiap proses dipilih oleh orang tuanya, proses yang memulainya. Dalam hal ini, orang tua adalah IIS. Ini mungkin mengarahkan Anda ke arah yang benar .
jpaugh

Jawaban:

197

Jika Anda melihat Consolekelas di .NET Reflector , Anda akan menemukan bahwa jika suatu proses tidak memiliki konsol terkait, Console.Outdan Console.Errordidukung oleh Stream.Null(dibungkus dengan a TextWriter), yang merupakan implementasi tiruan Streamyang pada dasarnya mengabaikan semua input, dan tidak memberikan hasil.

Jadi secara konsep setara dengan /dev/null, tetapi implementasinya lebih ramping: tidak ada I / O aktual yang terjadi dengan perangkat nol.

Selain itu, selain menelepon SetOut, tidak ada cara untuk mengkonfigurasi default.

Ruben
sumber
18
Gunakan System.Diagnostics.Debug.WriteLine () jika Anda benar-benar ingin sesuatu ditulis ke jendela Output, yang dapat Anda lihat saat debugging.
Ε Г И І И О
743

Jika Anda menggunakan System.Diagnostics.Debug.WriteLine(...)alih-alih Console.WriteLine(), maka Anda dapat melihat hasilnya di jendela Output dari Visual Studio.

Greg Bernhardt
sumber
45
Saya akan mengajukan pertanyaan yang sama dengan Kevin, tetapi ini adalah jawaban yang saya cari.
Zasz
11
Satu lagi petunjuk kecil; jika Anda mencetak string yang diformat, gunakan Debug.Print daripada Debug.WriteLine untuk menghindari konflik argumen (lihat social.msdn.microsoft.com/Forums/ar/Vsexpressvcs/thread/… ).
Nicholas Riley
12
Perhatikan bahwa debugger perlu dilampirkan agar pesan ditampilkan di jendela Output.
Cosmin
4
Apakah ini tidak berfungsi untuk IIS lokal atau sesuatu? Saya sepertinya tidak bisa menulis ke output untuk kehidupan saya, meskipun saya memulai ini dengan F5 (jadi debugger terpasang). Saya tahu kode saya sedang dieksekusi karena saya dapat menulis ke file dengan baik.
Kat
@ Cosmin Apa tepatnya .exe yang harus saya lampirkan di VS?
Grace
26

Saya telah menemukan pertanyaan ini dengan mencoba mengubah keluaran Log dari DataContext ke jendela keluaran. Jadi bagi siapa pun yang mencoba melakukan hal yang sama, apa yang saya lakukan adalah membuat ini:

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 setelah itu: dc.Log = new DebugTextWriter () dan saya bisa melihat semua pertanyaan di jendela output (dc adalah DataContext).

Lihat ini untuk info lebih lanjut: http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-memory-or-multiple-writers

Artur Carvalho
sumber
Mengapa tidak menggunakan pembungkus statis saja, mengingat Anda menggunakan metode yang sepenuhnya statis? Mengapa repot memperpanjang TextWriter?
Kat
1
Anda juga bisa menggunakannya dc.Log = s => Debug.WriteLine(s);.
Rudey
1
Application_Start: System.Console.SetOut (DebugTextWriter ()) baru;
Stefan Steiger
Bahkan lebih baik, Console.SetOut (DebugTextWriter ()) baru;
Alde
18

Jika Anda menggunakan IIS Express dan meluncurkannya melalui command prompt, itu akan membiarkan jendela DOS terbuka, dan Anda akan melihat Console.Writepernyataan di sana.

Jadi misalnya, buka jendela perintah dan ketik:

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

Ini mengasumsikan Anda memiliki direktori situs web di C: \ Projects \ Website1. Ini akan memulai IIS Express dan melayani halaman-halaman dalam direktori situs web Anda. Ini akan membiarkan jendela perintah terbuka, dan Anda akan melihat informasi keluaran di sana. Katakanlah Anda memiliki file di sana, default.aspx, dengan kode ini di dalamnya:

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

Atur browser Anda dan perintah windows sehingga Anda bisa melihatnya di layar. Sekarang ketik ke browser Anda: http://localhost:1655/. Anda akan melihat Halo! di halaman web, tetapi di jendela perintah Anda akan melihat sesuatu seperti

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

Saya membuatnya sederhana dengan memiliki kode dalam blok kode di markup, tetapi setiap pernyataan konsol dalam kode Anda di belakang atau di mana pun dalam kode Anda akan ditampilkan di sini juga.

Chris
sumber
+1 Saya selalu menggunakan IIS Express saat mengembangkan untuk alasan ini. Output konsol sangat berharga, digunakan di bagian belakang seperti konsol javascript di ujung depan. Menghemat banyak waktu debugging, bukan menggunakan log server berbasis file. Anda tidak perlu mengesampingkan penanganan pengecualian "ramah" - pertahankan halaman browser "oops" yang bagus, dan cukup tampilkan pengecualian ke konsol, mudah dilihat.
ingredient_15939
9

System.Diagnostics.Debug.WriteLine(...);masuk ke Jendela Segera di Visual Studio 2008.

Pergi ke menu Debug -> Windows -> Segera :

Masukkan deskripsi gambar di sini

Nik
sumber
Dalam Visual Studio 2012 saya, saya mengikuti apa yang Anda katakan tetapi string muncul di Outputtepat di samping Immediate WindowTerima kasih!
WTFZane
6

Tidak ada konsol mendengarkan secara default. Berjalan dalam mode debug ada konsol terpasang, tetapi dalam lingkungan produksi seperti yang Anda duga, pesan tidak pergi ke mana pun karena tidak ada yang mendengarkan.

Craig Tyler
sumber
5

Kecuali Anda menggunakan aplikasi konsol yang ketat, saya tidak akan menggunakannya, karena Anda tidak dapat melihatnya. Saya akan menggunakan Trace.WriteLine () untuk informasi tipe debugging yang dapat dihidupkan dan dimatikan dalam produksi.

Charles Graham
sumber
Yap, ini adalah tempat yang baik untuk memulai: msdn.microsoft.com/en-us/library/x5952w0c.aspx
Zhaph - Ben Duguid
3

The TraceContextobjek dalam ASP.NET menulis dengan DefaultTraceListeneryang output untuk proses host output standar . Daripada menggunakan Console.Write(), jika Anda menggunakanTrace.Write , output akan menuju ke output standar dari proses.

Anda bisa menggunakan System.Diagnostics.Processobjek untuk mendapatkan proses ASP.NET untuk situs Anda dan memantau output standar menggunakan OutputDataRecievedacara tersebut.

Brian Griffin
sumber
1

jika Anda menggunakan NLog di proyek ASP.net Anda, Anda dapat menambahkan target Debugger :

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

dan menulis log ke target ini untuk level yang Anda inginkan:

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

sekarang Anda memiliki keluaran konsol seperti Jetty di jendela "Keluaran" VS, dan pastikan Anda menjalankan dalam Mode Debug (F5).

mickey
sumber
0

Ini membingungkan bagi semua orang ketika datang IISExpress. Tidak ada yang membaca pesan konsol. Jadi misalnya, dalam aplikasi ASPCORE MVC mengonfigurasi menggunakan appsettings.json yang tidak melakukan apa-apa jika Anda menggunakan IISExpress.

Untuk saat ini Anda bisa menambahkan loggerFactory.AddDebug (LogLevel.Debug); di bagian Konfigurasi Anda dan setidaknya akan menunjukkan Anda log Anda di jendela Output Debug.

Berita baik CORE 2.0 ini semua akan berubah: https://github.com/aspnet/Announcements/issues/255

Chris Go
sumber
0

Mac, Dalam mode Debug ada tab untuk Output. masukkan deskripsi gambar di sini

Thushara Buddhika
sumber
-3

Dalam aplikasi ASP.NET, saya pikir itu pergi ke jendela Output atau Console yang terlihat selama debugging.

Leon Tayson
sumber