¿A dónde va Console.WriteLine en ASP.NET?

313

En una aplicación J2EE (como una que se ejecuta en WebSphere), cuando la uso System.out.println(), mi texto pasa a la salida estándar, que la consola de administración de WebSphere asigna a un archivo.

En una aplicación ASP.NET (como una que se ejecuta en IIS), ¿a dónde va la salida de Console.WriteLine()? El proceso IIS debe tener un stdin, stdout y stderr; ¿pero stdout está asignado a la versión de Windows de / dev / null o me falta un concepto clave aquí?

No estoy preguntando si debo iniciar sesión allí (uso log4net), pero ¿a dónde va la salida? Mi mejor información provino de esta discusión donde dicen que Console.SetOut()puede cambiar el TextWriter, pero aún no respondió la pregunta sobre cuál es el valor inicial de la consola o cómo configurarlo en config / fuera del código de tiempo de ejecución.

Kevin Hakanson
fuente
En realidad, iría al STDOUT del proceso de trabajo ASP.NET. Donde se señala eso, no estoy seguro.
FlySwat
2
Esa es la pregunta: ¿a dónde va STDOUT?
Kevin Hakanson
35
aparentemente nadie lo sabe, pero todos lo usan en sus ejemplos. wtf
Jason
si estaba buscando propósitos de depuración, recomendaría la respuesta de @Greg Bernhardt a continuación.
Ram
1
@KevinHakanson FWIW todos estos años después, stdout para cualquier proceso es elegido por su padre, el proceso que lo inició. En este caso, el padre sería IIS. Esto podría indicarle la dirección correcta .
jpaugh

Respuestas:

197

Si observa la Consoleclase en .NET Reflector , encontrará que si un proceso no tiene una consola asociada Console.Outy Console.Errorestá respaldado por Stream.Null(envuelto dentro de a TextWriter), que es una implementación ficticia Streamque básicamente ignora todas las entradas, y no da salida

Por lo tanto, es conceptualmente equivalente a /dev/null, pero la implementación es más simplificada: no hay ninguna E / S real con el dispositivo nulo.

Además, aparte de llamar SetOut, no hay forma de configurar el valor predeterminado.

Rubén
fuente
18
Utilice System.Diagnostics.Debug.WriteLine () si realmente desea que se escriba algo en la ventana Salida, que puede ver al depurar.
Ε Г И І И О
743

Si usa en System.Diagnostics.Debug.WriteLine(...)lugar de Console.WriteLine(), puede ver los resultados en la ventana Salida de Visual Studio.

Greg Bernhardt
fuente
45
Hubiera hecho la misma pregunta que Kevin, pero esta es la respuesta que habría estado buscando.
Zasz
11
Una pequeña pista más; si está imprimiendo una cadena con formato, use Debug.Print en lugar de Debug.WriteLine para evitar un conflicto de argumento (consulte social.msdn.microsoft.com/Forums/ar/Vsexpressvcs/thread/… ).
Nicholas Riley el
12
Tenga en cuenta que el depurador debe adjuntarse para que los mensajes se muestren en la ventana Salida.
Cosmin
44
¿Esto no funciona para IIS local o algo así? Parece que no puedo escribir en la salida durante toda mi vida, a pesar del hecho de que estoy comenzando esto con F5 (por lo que el depurador está conectado). Sé que mi código se está ejecutando porque puedo escribir bien en un archivo.
Kat
@ Cosmin ¿Qué .exe exacto al que debo adjuntar en VS?
Grace
26

Encontré esta pregunta tratando de cambiar la salida del registro del DataContext a la ventana de salida. Entonces, para cualquiera que intente hacer lo mismo, lo que hice fue crear esto:

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

Y después de eso: dc.Log = new DebugTextWriter () y puedo ver todas las consultas en la ventana de salida (dc es el DataContext).

Eche un vistazo a esto para obtener más información: http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-memory-or-multiple-writers

Artur Carvalho
fuente
¿Por qué no usar un envoltorio estático, dado que está envolviendo métodos completamente estáticos? ¿Por qué molestarse en extender TextWriter?
Kat
1
También podrías usar dc.Log = s => Debug.WriteLine(s);.
Rudey
1
Application_Start: System.Console.SetOut (new DebugTextWriter ());
Stefan Steiger
Aún mejor, Console.SetOut (nuevo DebugTextWriter ());
Alde
18

Si está utilizando IIS Express y lo inicia a través de un símbolo del sistema, dejará abierta la ventana de DOS y verá las Console.Writedeclaraciones allí.

Entonces, por ejemplo, abra una ventana de comandos y escriba:

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

Esto supone que tiene un directorio de sitio web en C: \ Proyectos \ Sitio web1. Iniciará IIS Express y servirá las páginas en el directorio de su sitio web. Dejará abiertas las ventanas de comandos y verá información de salida allí. Digamos que tenía un archivo allí, default.aspx, con este código:

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

Organice su navegador y ventanas de comandos para que pueda verlos en la pantalla. Ahora escriba en su navegador: http://localhost:1655/. Verás Hola! en la página web, pero en la ventana de comandos verá algo como

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

Lo hice simple al tener el código en un bloque de código en el marcado, pero aquí también se mostrará cualquier declaración de consola en su código subyacente o en cualquier otro lugar de su código.

Chris
fuente
+1 Siempre uso IIS Express durante el desarrollo por este motivo. La salida de la consola es invaluable, se usa en la parte trasera como la consola javascript en la parte delantera. Ahorra un montón de tiempo de depuración, en lugar de usar un registro de servidor basado en archivos. No tiene que anular el manejo de excepciones "amigable": mantenga la bonita página del navegador "oops" y simplemente envíe la excepción a la consola, fácil de ver.
ingrediente_15939
9

System.Diagnostics.Debug.WriteLine(...);lo pone en la ventana Inmediato en Visual Studio 2008.

Vaya al menú Depurar -> Windows -> Inmediato :

Ingrese la descripción de la imagen aquí

Nik
fuente
En mi Visual Studio 2012, seguí lo que dijiste, pero la cadena apareció Outputjusto después de Immediate Window¡Gracias!
WTFZane
6

Simplemente no hay consola escuchando por defecto. Ejecutando en modo de depuración hay una consola conectada, pero en un entorno de producción es como sospechaba, el mensaje simplemente no va a ninguna parte porque nada está escuchando.

Craig Tyler
fuente
5

A menos que esté en una aplicación de consola estricta, no la usaría, porque realmente no puede verla. Usaría Trace.WriteLine () para la información del tipo de depuración que se puede activar y desactivar en producción.

Charles Graham
fuente
Sí, aquí hay un buen lugar para comenzar: msdn.microsoft.com/en-us/library/x5952w0c.aspx
Zhaph - Ben Duguid
3

El TraceContextobjeto en ASP.NET escribe en las DefaultTraceListenersalidas que se envían a la salida estándar del proceso del host . En lugar de usar Console.Write(), si usa Trace.Write, la salida irá a la salida estándar del proceso.

Puede usar el System.Diagnostics.Processobjeto para obtener el proceso ASP.NET para su sitio y monitorear la salida estándar usando el OutputDataRecievedevento.

Brian Griffin
fuente
1

si usó NLog en su proyecto ASP.net, puede agregar un objetivo de depurador :

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

y escribe registros en este objetivo para los niveles que desea:

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

ahora tiene salida de consola como Jetty en la ventana "Salida" de VS, y asegúrese de estar ejecutando en modo de depuración (F5).

mickey
fuente
0

Esto es confuso para todos cuando se trata de IISExpress. No hay nada para leer los mensajes de la consola. Entonces, por ejemplo, en las aplicaciones ASPCORE MVC se configura usando appsettings.json que no hace nada si está usando IISExpress.

Por ahora, solo puede agregar loggerFactory.AddDebug (LogLevel.Debug); en su sección Configurar y al menos le mostrará sus registros en la ventana Salida de depuración.

Buenas noticias CORE 2.0, todo esto cambiará: https://github.com/aspnet/Announcements/issues/255

Chris Go
fuente
0

Mac, en modo de depuración hay una pestaña para la salida. ingrese la descripción de la imagen aquí

Thushara Buddhika
fuente
-3

En una aplicación ASP.NET, creo que va a la ventana Salida o Consola que está visible durante la depuración.

Leon Tayson
fuente