web-dev-qa-db-fra.com

Où va Console.WriteLine dans ASP.NET?

Dans une application J2EE (comme une application exécutée dans WebSphere), lorsque j'utilise System.out.println(), mon texte passe en sortie standard, mappée sur un fichier par la console d'administration WebSphere.

Dans une application ASP.NET (comme une application exécutée dans IIS), où va la sortie de Console.WriteLine()? Le processus IIS doit avoir un stdin, un stdout et un stderr; mais stdout est-il associé à la version Windows de/dev/null ou manque-t-il un concept clé ici?

Je suis ne demande pas si je dois me connecter à cet emplacement (j'utilise log4net), mais où va la sortie? Ma meilleure information vient de cette discussion où ils disent que Console.SetOut() peut changer le TextWriter, mais il n'a toujours pas répondu à la question sur la valeur initiale de la console ou sur la manière de la définir dans config/en dehors de l'exécution code.

273
Kevin Hakanson

Si vous examinez la classe Console dans .NET Reflector , vous constaterez que si un processus ne possède pas de console associée, Console.Out et Console.Error sont pris en charge par Stream.Null (encadré dans une TextWriter), qui est une valeur factice. implémentation de Stream qui ignore fondamentalement toutes les entrées et ne donne aucune sortie.

Donc, conceptuellement, cela équivaut à /dev/null, mais la mise en œuvre est plus simple: aucune entrée/sortie réelle n’a lieu avec le périphérique null.

De plus, mis à part l'appel SetOut, il n'y a aucun moyen de configurer la valeur par défaut.

178
Ruben

Si vous utilisez System.Diagnostics.Debug.WriteLine(...) au lieu de Console.WriteLine(), vous pouvez voir les résultats dans la fenêtre Sortie de Visual Studio.

661
Greg Bernhardt

J'ai trouvé cette question en essayant de changer la sortie du journal du DataContext dans la fenêtre de sortie. Donc, pour tous ceux qui essaient de faire la même chose, ce que j'ai fait était de créer ceci:

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

Après cela: dc.Log = new DebugTextWriter () et je peux voir toutes les requêtes dans la fenêtre de sortie (dc est le DataContext).

Jetez un coup d'oeil à cela pour plus d'informations: http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-memory-or-multiple-writers

24
Artur Carvalho

Si vous utilisez IIS Express et que vous le lancez via une invite de commande, la fenêtre DOS sera ouverte et vous y verrez les instructions Console.Write.

Ainsi, par exemple, ouvrez une fenêtre de commande et tapez:

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

Cela suppose que vous avez un répertoire de site Web dans C:\Projects\Website1. Il lancera IIS Express et servira les pages du répertoire de votre site Web. Il laissera les fenêtres de commande ouvertes et vous y verrez les informations de sortie. Disons que vous avez un fichier là-bas, default.aspx, avec ce code dedans:

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

Organisez votre navigateur et les fenêtres de commande afin que vous puissiez les voir tous les deux à l'écran. Maintenant, tapez dans votre navigateur: http://localhost:1655/. Vous allez voir bonjour! sur la page Web, mais dans la fenêtre de commande, vous verrez quelque chose comme

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

J'ai simplifié les choses en insérant le code dans un bloc de code dans le balisage, mais toutes les instructions de console figurant dans votre code-behind ou ailleurs dans votre code s'afficheront également ici.

17
Chris

Il n'y a tout simplement pas de console qui écoute par défaut. En mode débogage, une console est connectée, mais dans un environnement de production, comme vous le supposiez, le message ne va nulle part, car rien n’écoute.

6
Craig Tyler

System.Diagnostics.Debug.WriteLine(...); le place dans la fenêtre Immediate de Visual Studio 2008.

Aller au menu Debug -> Windows -> Immediate :

Enter image description here

6
Nik

À moins que vous ne soyez dans une application de console stricte, je ne l'utiliserais pas, parce que vous ne pouvez pas vraiment le voir. J'utiliserais Trace.WriteLine () pour les informations de type débogage pouvant être activées et désactivées en production.

4
Charles Graham

L’objet TraceContext dans ASP.NET écrit dans DefaultTraceListener, qui renvoie au processus hôte ’ sortie standard . Plutôt que d'utiliser Console.Write(), si vous utilisez Trace.Write, la sortie ira à la sortie standard du processus.

Vous pouvez utiliser l'objet System.Diagnostics.Process pour obtenir le processus ASP.NET pour votre site et surveiller la sortie standard à l'aide de l'événement OutputDataRecieved.

3
Brian Griffin

si vous utilisez NLog dans votre projet ASP.net, vous pouvez ajouter une cible Debugger :

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

et écrit des journaux sur cette cible pour les niveaux souhaités:

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

maintenant, vous avez une sortie de console comme Jetty dans la fenêtre "Sortie" de VS et assurez-vous que vous utilisez le mode Debug (F5).

0
mickey

C'est déroutant pour tout le monde quand il s'agit d'IISExpress. Il n'y a rien pour lire les messages de la console. Ainsi, par exemple, dans les applications ASPCORE MVC, il est configuré à l'aide de appsettings.json, ce qui ne fait rien si vous utilisez IISExpress.

Pour le moment, vous pouvez simplement ajouter loggerFactory.AddDebug (LogLevel.Debug); dans votre section de configuration et il vous montrera au moins vos journaux dans la fenêtre de sortie de débogage.

Bonne nouvelle CORE 2.0: tout cela changera: https://github.com/aspnet/Announcements/issues/255

0
Chris Go