Console.WriteLine在ASP.NET中位于何处?


313

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

在ASP.NET应用程序(如在IIS中运行的应用程序)中,输出的结果在Console.WriteLine()哪里?IIS进程必须具有stdin,stdout和stderr。但是stdout映射到Windows版本的/ dev / null还是在这里缺少关键概念?

不是问我是否应该登录那里(我使用log4net),但是输出会去哪里?我最好的信息来自这个讨论,他们说Console.SetOut()可以更改TextWriter,但是它仍然没有回答有关Console初始值是什么,还是如何在运行时代码的config /之外设置它的问题。


它实际上将进入ASP.NET Worker进程的STDOUT。指向哪里,我不确定。
FlySwat

2
这就是问题-STDOUT往哪里去?
Kevin Hakanson,2009年

35
显然没有人知道,但是每个人都在示例中使用它。wtf
杰森

如果您正在寻找调试目的,请参考下面的@Greg Bernhardt答复。
2015年

1
这些年来,@ KevinHakanson FWIW,任何进程的标准输出都是由其父进程(启动它的进程)选择的。在这种情况下,父级将是IIS。这可能会为您指明正确的方向
jpaugh

Answers:


197

如果您查看.NET Reflector中的Console类,您会发现,如果一个进程没有关联的控制台,并且由(包装在内)作为后盾,这是一个虚拟实现,基本上忽略了所有输入,并且没有输出。Console.OutConsole.ErrorStream.NullTextWriterStream

因此,从概念上讲/dev/null,它等效于,但是实现更加简化:空设备没有实际的I / O发生。

另外,除了调用之外SetOut,没有其他方法可以配置默认值。


18
如果您确实希望将某些内容写入到“输出”窗口中,则可以使用System.Diagnostics.Debug.WriteLine(),在调试时可以查看该窗口。
ΕГИІИО

743

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


45
我会问和凯文一样的问题,但这是我一直在寻找的答案。
Zasz 2011年

11
还有一点小提示;如果要打印格式化的字符串,请使用Debug.Print而不是Debug.WriteLine以避免参数冲突(请参阅social.msdn.microsoft.com/Forums/ar/Vsexpressvcs/thread/…)。
Nicholas Riley

12
请注意,需要附加调试器才能在“输出”窗口中显示消息。
Cosmin

4
这对本地IIS无效吗?尽管我是从F5开始的(实际上是连接了调试器),但我似乎终生无法写入输出。我知道我的代码正在执行,因为我可以写一个文件了。
凯特2015年

@Cosmin我应该在VS中附加哪个确切的.exe?
恩典

26

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


考虑到要包装完全静态的方法,为什么不只使用静态包装器呢?为什么要麻烦扩展TextWriter
凯特2015年

1
您也可以使用dc.Log = s => Debug.WriteLine(s);
Rudey

1
Application_Start:System.Console.SetOut(new DebugTextWriter());
Stefan Steiger's

更好的是,Console.SetOut(new DebugTextWriter());
ALDE

18

如果您正在使用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/。您会看到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

我通过将代码放在标记中的代码块中来使其变得简单,但是在代码后方或代码中其他任何地方的任何控制台语句也将在此处显示。


+1由于这个原因,我在开发时总是使用IIS Express。控制台输出非常宝贵,在后端使用,就像在前端使用javascript控制台一样。与使用基于文件的服务器日志相比,节省了大量调试时间。您不必重写“友好的”异常处理-保留漂亮的“ oops”浏览器页面,只需将异常输出到控制台即可轻松看到。
ingredient_15939

9

System.Diagnostics.Debug.WriteLine(...);将其放入Visual Studio 2008中的“ 立即窗口”中。

进入菜单 调试 -> Windows- > 立即

在此处输入图片说明


在我的Visual Studio 2012中,我按照您说的去做,但字符串出现在OutputImmediate Window谢谢” 旁边!
WTFZane

6

默认情况下,根本没有控制台监听。在调试模式下运行时,连接了一个控制台,但是在生产环境中,就像您所怀疑的那样,该消息不会随处可见,因为没有人在听。



3

TraceContextASP.NET中的对象DefaultTraceListener向主机进程的标准输出写入。Console.Write()如果不使用Trace.Write,而不是使用,输出将转到流程的标准输出。

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


1

如果您碰巧在ASP.net项目中使用了NLog,则可以添加Debugger目标

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


0

IISExpress令所有人感到困惑。没有什么可以读取控制台消息。因此,例如,在ASPCORE MVC应用程序中,它使用appsettings.json配置,如果您使用的是IISExpress,则不执行任何操作。

现在,您只需添加loggerFactory.AddDebug(LogLevel.Debug);。在“配置”部分中,它将至少在“调试输出”窗口中显示您的日志。

好消息CORE 2.0将会改变:https : //github.com/aspnet/Announcements/issues/255



-3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.