在J2EE应用程序(如在WebSphere中运行的应用程序)中,当我使用System.out.println()
时,我的文本转到标准输出,由WebSphere管理控制台映射到文件。
在ASP.NET应用程序(如在IIS中运行的应用程序)中,Console.WriteLine()
的输出在哪里? IIS进程必须有stdin,stdout和stderr;但是stdout映射到Windows版本的/ dev / null还是我错过了一个关键概念?
我不询问我是否应该登录(我使用log4net),但输出在哪里?我的最佳信息来自discussion,他们说Console.SetOut()
可以更改TextWriter
,但它仍然没有回答有关控制台初始值是什么或者如何更改的问题将它设置在运行时代码的config /之外。
答案 0 :(得分:680)
如果您使用System.Diagnostics.Debug.WriteLine(...)
代替Console.WriteLine()
,则可以在Visual Studio的输出窗口中查看结果。
答案 1 :(得分:185)
如果您查看.NET Reflector中的Console
课程,您会发现如果某个流程没有关联的控制台,则会Console.Out
和Console.Error
支持by Stream.Null
(包含在TextWriter
内),这是Stream
的虚拟实现,它基本上忽略了所有输入,并且没有输出。
因此它在概念上等同于/dev/null
,但实现更加简化:使用null设备不会发生实际的I / O.
此外,除了调用SetOut
之外,无法配置默认值。
答案 2 :(得分:24)
我通过尝试将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
答案 3 :(得分:17)
如果您使用的是IIS Express并通过命令提示符启动它,它将使DOS窗口保持打开状态,您将在那里看到Console.Write
语句。
例如,打开命令窗口并输入:
"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
我通过将代码放在标记的代码块中来简化,但是code-behind或代码中其他任何位置的任何控制台语句也会显示在此处。
答案 4 :(得分:6)
默认情况下根本没有控制台监听。在调试模式下运行时附加了一个控制台,但是在生产环境中,它是您所怀疑的,因为没有任何内容正在侦听,因此消息不会消失。
答案 5 :(得分:6)
System.Diagnostics.Debug.WriteLine(...);
将其放入Visual Studio 2008中的立即窗口。
转到菜单调试 - &gt; Windows - &gt; 立即:
答案 6 :(得分:4)
除非您使用严格的控制台应用程序,否则我不会使用它,因为您无法真正看到它。我会使用Trace.WriteLine()来获取可在生产中打开和关闭的调试类型信息。
答案 7 :(得分:3)
ASP.NET中的TraceContext
对象写入DefaultTraceListener
,输出到主机进程“standard output。如果使用Console.Write()
,输出将转到流程的标准输出,而不是使用Trace.Write
。
您可以使用System.Diagnostics.Process
对象来获取站点的ASP.NET进程,并使用OutputDataRecieved
事件监视标准输出。
答案 8 :(得分:0)
当IISExpress出现时,每个人都会感到困惑。没有什么可以阅读控制台消息。例如,在ASPCORE MVC应用程序中,它使用appsettings.json进行配置,如果您使用的是IISExpress,则无法执行任何操作。
现在你可以添加loggerFactory.AddDebug(LogLevel.Debug);在“配置”部分中,它至少会在“调试输出”窗口中显示您的日志。
好消息CORE 2.0这一切都将改变:https://github.com/aspnet/Announcements/issues/255
答案 9 :(得分:0)
如果您碰巧在ASP.net项目中使用了NLog,则可以添加Debugger target:
<targets>
<target name="debugger" xsi:type="Debugger"
layout="${date:format=HH\:mm\:ss}|${pad:padding=5:inner=${level:uppercase=true}}|${message} "/>
并将所需级别的日志写入此目标:
<rules>
<logger name="*" minlevel="Trace" writeTo="debugger" />
现在,在VS的“输出”窗口中,您具有与Jetty一样的控制台输出,并确保您在调试模式(F5)中运行。
答案 10 :(得分:0)
答案 11 :(得分:-3)
在ASP.NET应用程序中,我认为它会进入在调试期间可见的输出或控制台窗口。