Wohin geht Console.WriteLine in ASP.NET?

313

In einer J2EE-Anwendung (wie einer, die in WebSphere ausgeführt wird) wird System.out.println()mein Text bei Verwendung auf Standardausgabe übertragen, die von der WebSphere-Administratorkonsole einer Datei zugeordnet wird.

Wohin geht in einer ASP.NET-Anwendung (wie einer in IIS ausgeführten) die Ausgabe von Console.WriteLine()? Der IIS-Prozess muss stdin, stdout und stderr haben. Aber ist stdout der Windows-Version von / dev / null zugeordnet oder fehlt mir hier ein Schlüsselkonzept?

Ich frage nicht, ob ich mich dort anmelden soll (ich verwende log4net), aber wohin geht die Ausgabe? Meine besten Informationen kamen aus dieser Diskussion, in der sie sagten, dass sie Console.SetOut()das ändern können TextWriter, aber sie beantworteten immer noch nicht die Frage, wie der Anfangswert der Konsole lautet oder wie sie in config / außerhalb des Laufzeitcodes festgelegt werden soll.

Kevin Hakanson
quelle
Es würde tatsächlich zum STDOUT des ASP.NET Worker-Prozesses gehen. Wo darauf hingewiesen wird, weiß ich nicht genau.
FlySwat
2
Das ist die Frage - wohin geht STDOUT?
Kevin Hakanson
35
anscheinend weiß es niemand, aber jeder verwendet es in seinen Beispielen. wtf
Jason
Wenn Sie nach Debugging-Zwecken suchen, verweise ich auf die Antwort von @Greg Bernhardt unten.
Ram
1
@ KevinHakanson FWIW all diese Jahre später wird stdout für jeden Prozess von seinem Elternteil ausgewählt, dem Prozess, der ihn gestartet hat. In diesem Fall wäre das übergeordnete Element IIS. Dies könnte Sie in die richtige Richtung weisen .
Jpaugh

Antworten:

197

Wenn Sie sich die ConsoleKlasse in .NET Reflector ansehen , werden Sie feststellen, dass, wenn einem Prozess keine Konsole zugeordnet ist Console.Outund Console.Errorvon Stream.Null(in a eingeschlossen TextWriter) unterstützt wird, eine Dummy-Implementierung Stream, die im Grunde alle Eingaben ignoriert, und gibt keine Ausgabe.

Es ist also konzeptionell äquivalent zu /dev/null, aber die Implementierung ist rationaler: Es findet keine tatsächliche E / A mit dem Null-Gerät statt.

Abgesehen vom Aufrufen SetOutgibt es auch keine Möglichkeit, die Standardeinstellung zu konfigurieren.

Ruben
quelle
18
Verwenden Sie System.Diagnostics.Debug.WriteLine (), wenn tatsächlich etwas in das Ausgabefenster geschrieben werden soll, das Sie beim Debuggen anzeigen können.
Г И І І
743

Wenn Sie System.Diagnostics.Debug.WriteLine(...)anstelle von verwenden Console.WriteLine(), können Sie die Ergebnisse im Ausgabefenster von Visual Studio anzeigen.

Greg Bernhardt
quelle
45
Ich hätte die gleiche Frage gestellt wie Kevin, aber das ist die Antwort, nach der ich gesucht hätte.
Zasz
11
Noch ein kleiner Hinweis; Wenn Sie eine formatierte Zeichenfolge drucken, verwenden Sie Debug.Print anstelle von Debug.WriteLine, um einen Argumentkonflikt zu vermeiden (siehe social.msdn.microsoft.com/Forums/ar/Vsexpressvcs/thread/… ).
Nicholas Riley
12
Beachten Sie, dass der Debugger angehängt werden muss, damit die Nachrichten im Ausgabefenster angezeigt werden.
Cosmin
4
Funktioniert das nicht für lokales IIS oder so? Ich kann anscheinend nicht in der Lage sein, für mein ganzes Leben in die Ausgabe zu schreiben, obwohl ich dies mit F5 beginne (der Debugger ist also beigefügt). Ich weiß, dass mein Code ausgeführt wird, weil ich in eine Datei schreiben kann.
Kat
@Cosmin Welche genaue EXE-Datei sollte ich in VS anhängen?
Grace
26

Ich habe diese Frage gefunden, indem ich versucht habe, die Protokollausgabe des DataContext in das Ausgabefenster zu ändern. Für alle anderen, die versuchen, dasselbe zu tun, habe ich Folgendes erstellt:

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

Und danach: dc.Log = new DebugTextWriter () und ich können alle Abfragen im Ausgabefenster sehen (dc ist der DataContext).

Weitere Informationen finden Sie hier: http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-memory-or-multiple-writers

Artur Carvalho
quelle
Warum nicht einfach einen statischen Wrapper verwenden, da Sie vollständig statische Methoden umschließen? Warum sich die Mühe machen, zu verlängern TextWriter?
Kat
1
Sie könnten auch verwenden dc.Log = s => Debug.WriteLine(s);.
Rudey
1
Application_Start: System.Console.SetOut (neuer DebugTextWriter ());
Stefan Steiger
Noch besser ist Console.SetOut (neuer DebugTextWriter ());
Alde
18

Wenn Sie IIS Express verwenden und es über eine Eingabeaufforderung starten, wird das DOS- Fenster geöffnet und dort werden Anweisungen angezeigt Console.Write.

Öffnen Sie beispielsweise ein Befehlsfenster und geben Sie Folgendes ein:

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

Dies setzt voraus, dass Sie ein Website-Verzeichnis unter C: \ Projects \ Website1 haben. Es startet IIS Express und stellt die Seiten in Ihrem Website-Verzeichnis bereit. Das Befehlsfenster bleibt geöffnet, und dort werden Ausgabeinformationen angezeigt. Angenommen, Sie hatten dort eine Datei, default.aspx, mit diesem Code:

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

Ordnen Sie Ihren Browser und die Befehlsfenster so an, dass Sie beide auf dem Bildschirm sehen können. Geben Sie nun in Ihren Browser ein : http://localhost:1655/. Du wirst Hallo sehen! auf der Webseite, aber im Befehlsfenster sehen Sie so etwas wie

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

Ich habe es einfach gemacht, indem ich den Code in einem Codeblock im Markup habe, aber alle Konsolenanweisungen in Ihrem Code-Behind oder irgendwo anders in Ihrem Code werden auch hier angezeigt.

Chris
quelle
+1 Aus diesem Grund verwende ich bei der Entwicklung immer IIS Express. Die Konsolenausgabe ist von unschätzbarem Wert und wird am Backend wie die Javascript-Konsole am Frontend verwendet. Spart viel Zeit beim Debuggen, anstatt ein dateibasiertes Serverprotokoll zu verwenden. Sie müssen die "freundliche" Ausnahmebehandlung nicht überschreiben - behalten Sie die nette "oops" -Browserseite bei und geben Sie die Ausnahme einfach an die Konsole aus, damit sie leicht zu sehen ist.
ingredient_15939
9

System.Diagnostics.Debug.WriteLine(...);Ruft es in das Direktfenster in Visual Studio 2008 ab.

Gehen Sie zum Menü Debug -> Windows -> Sofort :

Geben Sie hier die Bildbeschreibung ein

Nik
quelle
In meinem Visual Studio 2012 habe ich das befolgt, was Sie gesagt haben, aber die Zeichenfolge wurde Outputneben dem Immediate WindowDankeschön angezeigt!
WTFZane
6

Standardmäßig hört einfach keine Konsole zu. Im Debug-Modus ist eine Konsole angeschlossen, aber in einer Produktionsumgebung geht die Nachricht, wie Sie vermutet haben, einfach nirgendwo hin, weil nichts abgehört wird.

Craig Tyler
quelle
5

Wenn Sie sich nicht in einer strengen Konsolenanwendung befinden, würde ich sie nicht verwenden, da Sie sie nicht wirklich sehen können. Ich würde Trace.WriteLine () zum Debuggen von Informationen verwenden, die in der Produktion ein- und ausgeschaltet werden können.

Charles Graham
quelle
Ja, hier ist ein guter Anfang: msdn.microsoft.com/en-us/library/x5952w0c.aspx
Zhaph - Ben Duguid
3

Das TraceContextObjekt in ASP.NET schreibt in die StandardausgabeDefaultTraceListener des Hostprozesses . Anstatt mit , wenn Sie verwenden , wird der Ausgang auf die Standardausgabe des Prozesses gehen.Console.Write()Trace.Write

Sie können das System.Diagnostics.ProcessObjekt verwenden, um den ASP.NET-Prozess für Ihre Site abzurufen und die Standardausgabe mithilfe des OutputDataRecievedEreignisses zu überwachen .

Brian Griffin
quelle
1

Wenn Sie NLog in Ihrem ASP.net-Projekt verwendet haben, können Sie ein Debugger-Ziel hinzufügen :

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

und schreibt Protokolle für die gewünschten Ebenen in dieses Ziel:

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

Jetzt haben Sie eine Konsolenausgabe wie Jetty im Fenster "Ausgabe" von VS und stellen sicher, dass Sie im Debug-Modus (F5) ausgeführt werden.

mickey
quelle
0

Dies ist für alle verwirrend, wenn es um IISExpress geht. Es gibt nichts zum Lesen von Konsolennachrichten. So wird beispielsweise in den ASPCORE MVC-Apps die Verwendung von appsettings.json konfiguriert, was bei Verwendung von IISExpress nichts bewirkt.

Im Moment können Sie einfach loggerFactory.AddDebug (LogLevel.Debug) hinzufügen. in Ihrem Abschnitt Konfigurieren und es zeigt Ihnen zumindest Ihre Protokolle im Fenster Debug-Ausgabe.

Gute Nachrichten CORE 2.0, das wird sich ändern: https://github.com/aspnet/Announcements/issues/255

Chris Go
quelle
0

Mac, Im Debug-Modus gibt es eine Registerkarte für die Ausgabe. Geben Sie hier die Bildbeschreibung ein

Thushara Buddhika
quelle
-3

In einer ASP.NET-Anwendung wird das Fenster "Ausgabe" oder "Konsole" angezeigt, das beim Debuggen angezeigt wird.

Leon Tayson
quelle