控制台在哪里?在ASP.NET中使用WriteLine ?

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

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

不是在问如果我应该在那里日志(我使用log4net),但输出去哪里?我最好的信息来自这个讨论,他们说Console.SetOut()可以改变TextWriter,但它仍然没有回答控制台的初始值是什么,或者如何在配置/运行时代码之外设置它的问题。

323566 次浏览

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

除非你在一个严格的控制台应用程序中,否则我不会使用它,因为你无法真正看到它。我将使用Trace.WriteLine()用于调试类型的信息,这些信息可以在生产环境中打开和关闭。

默认情况下没有控制台监听。在调试模式下运行会附加一个控制台,但在生产环境中,正如您所怀疑的那样,消息不会去任何地方,因为没有任何东西在监听。

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

如果你看一下. net Reflector中的Console类,你会发现如果进程没有相关的控制台,Console.OutConsole.ErrorStream.Null支持(包装在TextWriter中),这是Stream的一个虚拟实现,基本上忽略所有输入,并且没有输出。

因此,它在概念上等同于/dev/null,但实现更精简:null设备没有实际的I/O发生。

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

更新2020-11-02:由于这个答案在2020年仍在收集选票,可能应该注意到在ASP。NET Core,通常有附加一个控制台。你可以配置ASP。NET Core IIS模块,通过stdoutLogEnabledstdoutLogFile设置将所有标准输出和标准错误输出重定向到日志文件:

<system.webServer>
<aspNetCore processPath="dotnet"
arguments=".\MyApp.dll"
hostingModel="inprocess"
stdoutLogEnabled="true"
stdoutLogFile=".\logs\stdout" />
<system.webServer>

通过尝试将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

TraceContext对象在ASP。NET写入DefaultTraceListener,该DefaultTraceListener输出到主机进程` 标准输出。而不是使用Console.Write(),如果你使用Trace.Write,输出将进入进程的标准输出。

你可以使用System.Diagnostics.Process对象来获取ASP。NET进程,并使用OutputDataRecieved事件监视标准输出。

System.Diagnostics.Debug.WriteLine(...);将它放入visual studio 2008中的立即窗口中。

进入菜单调试 -> 窗户 -> 立即:

Enter image description here

如果你正在使用IIS Express并通过命令提示符启动它,它会打开DOS窗口,你会在那里看到Console.Write语句。

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

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

这假设你有一个网站目录在C:\Projects\Website1。它将启动IIS Express并为您的网站目录中的页面提供服务。它将打开命令窗口,您将在那里看到输出信息。假设这里有一个默认文件。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/。您将看到Hello!在网页上,但在命令窗口中,您将看到类似的内容

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

我通过在标记中的代码块中使用代码来简化它,但是后台代码中的任何控制台语句或代码中的其他任何地方都将在这里显示。

当提到IISExpress时,每个人都感到困惑。没有什么可以读取控制台消息。例如,在ASPCORE MVC应用中,它使用appsettings进行配置。json,如果你正在使用IISExpress,它什么都不做。

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

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

如果你碰巧在ASP.net项目中使用NLog,你可以添加调试器的目标:

<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)。

Mac,在调试模式下,有一个输出选项卡。 enter image description here < / p >

使用控制台。Writeline并不适合我。

有帮助的是设置一个断点,然后在调试时运行测试。 当它到达断点时,你可以观察到返回的是什么

尝试附加一些“后端调试器”来记录您的msg或数据到控制台或输出窗口,就像我们在节点控制台中所做的那样。

System.Diagnostics.Debug.WriteLine("Message" + variable)代替Console.WriteLine()

这样你就可以在Visual Studio的输出窗口(控制台)中看到结果。