提问



在J2EE应用程序(如在WebSphere中运行的应用程序)中,当我使用System.out.println()时,我的文本转到标准输出,由WebSphere管理控制台映射到文件。


在ASP.NET应用程序(如在IIS中运行的应用程序)中,Console.WriteLine()的输出在哪里? IIS进程必须有stdin,stdout和stderr;但是stdout映射到Windows版本的/dev/null还是我错过了一个关键概念?


没有问我是否应该登录(我使用log4net),但输出在哪里?我的最佳信息来自这个讨论,他们说Console.SetOut()可以改变Console.SetOut() 8]],但它仍然没有回答关于控制台的初始值是什么,或者如何在配置中/在运行时代码之外设置它的问题。[28]

最佳参考


如果你看一下.NET Reflector中的Console类,你会发现如果一个进程没有关联的控制台,Console.OutConsole.ErrorStream.Null支持。]](包含在TextWriter内部,这是Stream的虚拟实现,它基本上忽略了所有输入,并且没有输出。[29]


因此它在概念上等同于/dev/null,但实现更加简化:使用null设备不会发生实际的I/O.


此外,除了调用SetOut之外,无法配置默认值。

其它参考1


如果使用System.Diagnostics.Debug.WriteLine(...)而不是Console.WriteLine(),则可以在Visual Studio的输出窗口中看到结果。

其它参考2


我通过尝试将DataContext的Log输出更改为输出窗口来找到这个问题。所以对于其他试图做同样事情的人来说,我所做的就是创建这个:


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


在那之后:dc.Log=new DebugTextWriter(),我可以看到输出窗口中的所有查询(dc是DataContext)。


请查看更多信息:http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-memory-or-multiple-writers [30]

其它参考3


如果您正在使用IIS Express并通过命令提示符启动它,它将打开DOS窗口,您将看到Console.Write语句。[31]


例如,打开命令窗口并输入:


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


假设您在C:\\ Projects \\ Website1上有一个网站目录。它将启动IIS Express并提供您网站目录中的页面。它将使命令窗口保持打开状态,您将在那里看到输出信息。让我们说你有一个文件,default.aspx,里面有这个代码:


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


安排浏览器和命令窗口,以便在屏幕上看到它们。现在输入您的浏览器:http://localhost:1655/。你会看到你好!在网页上,但在命令窗口中你会看到类似的东西


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


我通过将代码放在标记的代码块中来简化,但代码隐藏或代码中任何其他位置的任何控制台语句也会显示在这里。[32]

其它参考4


默认情况下根本没有控制台监听。在调试模式下运行时,附加了一个控制台,但在生产环境中,它就像您所怀疑的那样,消息不会随处可见,因为没有任何东西正在侦听。

其它参考5


除非你是在一个严格的控制台应用程序,我不会使用它,因为你不能真正看到它。我会使用Trace.WriteLine()来获取可在生产中打开和关闭的调试类型信息。

其它参考6


System.Diagnostics.Debug.WriteLine(...);将其置于Visual  Studio  2008中的立即窗口中。


转到菜单调试 - > Windows - > 立即:




其它参考7


ASP.NET中的TraceContext对象写入DefaultTraceListener,它输出到主机进程的标准输出。如果使用Trace.Write,而不是使用Console.Write(),输出将转到过程的标准输出。[33]


您可以使用System.Diagnostics.Process对象获取站点的ASP.NET进程并使用OutputDataRecieved事件监视标准输出。

其它参考8


当IISExpress出现时,每个人都会感到困惑。没有什么可以读取控制台消息。例如,在ASPCORE MVC应用程序中,它使用appsettings.json进行配置,如果您使用的是IISExpress,则无法执行任何操作。


现在你可以添加loggerFactory.AddDebug(LogLevel.Debug);在配置部分中,它至少会在调试输出窗口中显示您的日志。


好消息CORE 2.0这一切都将改变:https://github.com/aspnet/Announcements/issues/255 [34]

其它参考9


在ASP.NET应用程序中,我认为它是在调试期间可见的输出或控制台窗口。

其它参考10


如果查看调试窗口,您将看到console.writelines。