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

时间:2020-03-06 14:45:52  来源:igfitidea点击:

在一个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.OutConsole.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