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.
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.
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.
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
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.
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.
System.Diagnostics.Debug.WriteLine(...);
le place dans la fenêtre Immediate de Visual Studio 2008.
Aller au menu Debug -> Windows -> Immediate :
À 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.
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
.
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).
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