ASP.NET'te Console.WriteLine nereye gider?


313

Bir J2EE uygulamasında (WebSphere'de çalışan biri gibi) kullandığımda System.out.println(), metnim standart olarak çıkıyor ve bu da WebSphere yönetici konsolu tarafından bir dosyaya eşleniyor.

Bir ASP.NET uygulamasında (IIS'de çalışan biri gibi), çıktısı nereye Console.WriteLine()gider? IIS işleminin bir stdin, stdout ve stderr olması gerekir; ancak stdout / dev / null dosyasının Windows sürümüyle eşleştirildi veya burada önemli bir kavram mı eksik?

Ben (log4net kullanın) orada oturum gerekir eğer sormuyorum , ama çıktı nereye gidiyor? En iyi bilgilerim, bu tartışmayıConsole.SetOut() değiştirebileceklerini söyledikleri bir yerden geldi TextWriter, ancak yine de Konsol'un başlangıç ​​değerinin ne olduğu veya çalışma zamanı kodunun yapılandırma / dışında nasıl ayarlanacağı sorusuna cevap vermedi.


Aslında ASP.NET çalışan sürecinin STDOUT gider. Bunun nerede olduğuna emin değilim.
FlySwat

2
Soru bu - STDOUT nereye gidiyor?
Kevin Hakanson

35
Görünüşe göre kimse bilmiyor, ama herkes bunu örneklerinde kullanıyor. wtf
Jason

hata ayıklama amacıyla arıyorsanız ben aşağıda @ Berng Bernhardt cevap bakın.
Ram

1
@KevinHakanson FWIW bunca yıl sonra, herhangi bir süreç için stdout, ebeveynini başlatan süreç tarafından seçilir. Bu durumda, üst öğe IIS olacaktır. Bu sizi doğru yönde gösterebilir .
jpaugh

Yanıtlar:


197

.NET Reflector'dakiConsole sınıfa bakarsanız, bir işlemin ilişkili bir konsolu yoksa ve (a'nın içine sarılmış ) tarafından desteklendiğini görürsünüz .Console.OutConsole.ErrorStream.NullTextWriterStream o temelde tüm uyarıları dikkate almayan ve çıktı vermez.

Yani kavramsal olarak /dev/null , ancak uygulama daha akıcıdır: boş cihazla gerçek bir G / Ç yoktur.

Ayrıca, arama dışında SetOut, varsayılanı yapılandırmanın bir yolu yoktur.


18
Çıktı penceresine gerçekten hata ayıklama sırasında görüntüleyebileceğiniz bir şey yazılmasını istiyorsanız, System.Diagnostics.Debug.WriteLine () öğesini kullanın.
Ε Г И І И О

743

System.Diagnostics.Debug.WriteLine(...)Bunun yerine kullanırsanız Console.WriteLine(), sonuçları Visual Studio'nun Çıktı penceresinde görebilirsiniz .


45
Kevin ile aynı soruyu sormalıydım, ama aradığım cevap budur.
Zasz

11
Bir küçük ipucu daha; biçimlendirilmiş bir dize yazdırıyorsanız, bağımsız değişken çakışmasını önlemek için Debug.WriteLine yerine Debug.Print kullanın (bkz. social.msdn.microsoft.com/Forums/ar/Vsexpressvcs/thread/… ).
Nicholas Riley

12
İletilerin Çıktı penceresinde gösterilmesi için hata ayıklayıcının eklenmesi gerektiğini unutmayın.
Cosmin

4
Bu, yerel IIS veya başka bir şey için çalışmıyor mu? Buna F5 ile başladım (hata ayıklayıcı bağlı) olmasına rağmen, hayatım için çıktıya yazamıyorum. Güzel bir dosyaya yazabildiğim için kodumun yürütüldüğünü biliyorum.
Kat

@Cosmin VS'ye tam olarak hangi eklentiyi eklemeliyim?
Grace

26

Bu soruyu DataContext günlük çıktısını çıktı penceresine değiştirmeye çalışarak buldum. Aynı şeyi yapmaya çalışan herkese, yaptığım şey bunu yaratmaktı:

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

Bundan sonra: dc.Log = yeni DebugTextWriter () ve ben çıkış penceresinde tüm sorguları görebilirsiniz (dc DataContext).

Daha fazla bilgi için şuna bir göz atın: http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-memory-or-multiple-writers


Tamamen statik yöntemleri sarmanız nedeniyle neden sadece statik bir sarıcı kullanmıyorsunuz? Neden uzanmak zahmetine giriyor TextWriter?
Kat

1
Ayrıca kullanabilirsiniz dc.Log = s => Debug.WriteLine(s);.
Rudey

1
Application_Start: System.Console.SetOut (yeni DebugTextWriter ());
Stefan Steiger

Daha da iyisi, Console.SetOut (yeni DebugTextWriter ());
Alde

18

IIS Express kullanıyorsanız ve bunu bir komut istemi ile başlatırsanız, DOS penceresini açık bırakacak veConsole.Write burada ifadeler .

Örneğin, bir komut penceresi açın ve şunu yazın:

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

Bu, C: \ Projects \ Website1 adresinde bir web sitesi dizininizin olduğunu varsayar. IIS Express'i başlatır ve web sitesi dizininizdeki sayfaları sunar. Komut pencerelerini açık bırakacak ve orada çıkış bilgilerini göreceksiniz. Diyelim ki orada bir dosya var, default.aspx, içinde bu kod var:

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

Tarayıcınızı ve komut pencerelerini, her ikisini de ekranda görebilecek şekilde düzenleyin. Şimdi tarayıcınıza yazın: http://localhost:1655/. Merhaba göreceksiniz! Web sayfasında, ancak komut penceresinde aşağıdaki gibi bir şey göreceksiniz

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

Ben kodu biçimlendirme bir kod bloğuna sahip basit, ama kod arka veya kod başka bir yerde herhangi bir konsol deyimleri burada da gösterecektir.


+1 Bu nedenle geliştirirken daima IIS Express kullanıyorum. Konsol çıkışı paha biçilmezdir, arka uçta ön uçtaki javascript konsolu gibi kullanılır. Dosya tabanlı bir sunucu günlüğü kullanmak yerine hata ayıklama zamanından tasarruf sağlar. "Kolay" istisna işlemeyi geçersiz kılmak zorunda değilsiniz - güzel "ayy" tarayıcı sayfasını koruyun ve sadece istisnayı konsola çıktı olarak görmeniz kolay.
ingredient_15939

9

System.Diagnostics.Debug.WriteLine(...);Visual Studio 2008'de Anında Pencereye alır .

Hata ayıkla -> Windows -> Hemen menüsüne gidin :

Resim açıklamasını buraya girin


Visual Studio 2012'de söylediklerinizi takip ettim ama dize Teşekkürler'in Outputyanında görünüyordu Immediate Window!
WTFZane

6

Varsayılan olarak basit bir konsol dinleme özelliği yoktur. Hata ayıklama modunda çalışırken bir konsol takılıdır, ancak üretim ortamında şüphelendiğiniz gibi, hiçbir şey dinlemediği için mesaj hiçbir yere gitmez.



3

TraceContextASP.NET nesne yazar DefaultTraceListenerana işlemin hangi çıkışlar standart çıkış . Aksine kullanmaktan daha Console.Write()kullanırsanız, Trace.Writeçıkış sürecinin standart çıkışa gidecek.

Sen kullanabilirsiniz System.Diagnostics.ProcessSiteniz için ASP.NET sürecini olsun ve kullanarak standart çıktıyı izlemek için nesneyi OutputDataRecievedolayı.


1

ASP.net projenizde NLog kullandığınız takdirde, bir Hata Ayıklayıcı hedefi ekleyebilirsiniz :

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

ve istediğiniz seviyeler için günlükleri bu hedefe yazar:

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

şimdi VS'nin "Çıktı" penceresinde Jetty gibi konsol çıkışınız var ve Hata Ayıklama Modunda (F5) çalıştığınızdan emin olun.


0

IISExpress söz konusu olduğunda bu herkes için kafa karıştırıcıdır. Konsol mesajlarını okuyacak hiçbir şey yok. Örneğin, ASPCORE MVC uygulamalarında appsettings.json kullanarak yapılandırılır ve IISExpress kullanıyorsanız hiçbir şey yapmaz.

Şimdilik loggerFactory.AddDebug (LogLevel.Debug); Yapılandırma bölümünüzde, en azından Hata Ayıklama Çıktısı penceresinde günlüklerinizi gösterecektir.

İyi haber CORE 2.0 bunların hepsi değişecek: https://github.com/aspnet/Announcements/issues/255



-3

Bir ASP.NET uygulamasında, hata ayıklama sırasında görünür çıktı veya konsol penceresine gider düşünüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.