Console.WriteLine在ASP.NET中位于何处?
在一个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应用程序中,我认为它会转到在调试过程中可见的"输出"或者"控制台"窗口。
除非我们使用的是严格的控制台应用程序,否则我不会使用它,因为我们看不到它。我将使用Trace.WriteLine()获得可在生产环境中打开和关闭的调试类型信息。
默认情况下,根本没有控制台监听。在调试模式下运行时,连接了一个控制台,但是在生产环境中,正如我们所怀疑的那样,该消息不会随处可见,因为没有人在听。
如果使用System.Diagnostics.Debug.WriteLine(...)而不是Console.WriteLine(),则可以在Visual Studio的"输出"窗口中查看结果。
如果我们查看.NET Reflector中的Console
类,我们会发现,如果一个进程没有关联的控制台,则Console.Out
和Console.Error
将由Stream.Null
(包装在" TextWriter"中,这是" Stream"的虚拟实现,基本上忽略了所有输入,但不提供任何输出。
因此,从概念上讲,它等效于/ dev / null,但是实现更加简化:使用null设备不会发生实际的I / O。
另外,除了调用SetOut
,没有其他方法可以配置默认值。
我通过尝试将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